[解決済み] コマンド置換:バックティックまたはドル記号/ペレンで囲む?重複
質問
bashでコマンド置換を行うには、どのような方法が好ましいですか?
私はいつもこうしています。
echo "Hello, `whoami`."
しかし、最近はこのように書かれているのをよく見かけます。
echo "Hello, $(whoami)."
どのような構文が好ましいのか、またその理由は?それとも、ほとんど互換性があるのでしょうか?
私は前者を好む傾向がありますが、それは単に私のテキストエディタがそれが何であるかを知っていて、適切にシンタックスハイライトを行うからです。
読む こちら のように、エスケープされた文字はそれぞれのケースで少し異なる動作をするとのことですが、どちらの動作が望ましいのか、あるいは状況によって異なるだけなのか、私にはよくわかりません。
横から質問です。を使用することはバッドプラクティスですか? ともに を一つのスクリプトに含めることはできますか?例えば、コマンド置換をネストする場合などです。
解決方法は?
ここではいくつかの質問/問題があるので、投稿者の文章の各セクションをブロック引用して繰り返し、その後に私の回答を示します。
<ブロッククオートどのような構文が好ましいのか、またその理由は?それとも、ほとんど互換性があるのでしょうか?
私としては
$(some_command)
の方が望ましいです。
`some_command`
という形式があります。2番目の形式は、バッククォートのペア("`"文字、バックティックやグレイヴアクセントとも呼ばれます)を使用するもので、歴史的な方法です。ドル記号と括弧を使った最初の形式は、新しいPOSIXの形式であり、おそらくより標準的な方法であることを意味します。つまり、異なるシェルや異なる*nixの実装でより正しく動作する可能性が高いということです。
最初の (POSIX) 形式を好むもう一つの理由は、特にコマンドの置換がネストされている場合に読みやすいということです。さらに、バックスティック形式では、ネストされた(内部の)コマンド置換において、バックスラッシュ文字をエスケープする必要があります。
POSIX形式では、その必要はありません。
この2つの文字が互換性があるかどうかということですが、エスケープされた文字に関する例外を除けば、一般的には互換性があると言えると思います。しかし、すべての最新のシェルとすべての最新の*nixが両方の形式をサポートしているかどうか、私は知らないし、言うこともできない。特に古いシェルや古い *nix はそうではないでしょう。もし私があなたなら、完成したスクリプトを実行する予定のシェルや*nixの実装で、それぞれの形式の簡単なテストをいくつか実行せずに互換性に依存することはしないでしょう。
<ブロッククオート私のテキストエディタはそれが何であるかを知っているようで、適切にシンタックスハイライトを行うので、私は最初のものを好む傾向があります。
お使いのエディタがPOSIX形式をサポートしていないようなのは残念ですが、POSIXのやり方をサポートするエディタのアップデートがあるかどうか調べてみてはいかがでしょうか。長い道のりかもしれませんが、誰にもわからないことです。あるいは、別のエディタを試してみることも検討すべきかもしれません。
GGG、どんなテキストエディタを使っているんだ?
<ブロッククオートエスケープされた文字は、それぞれのケースで少し異なる動作をするとここで読んだのですが、どの動作が望ましいのか、それとも状況によって異なるだけなのか、私にはよくわかりません。
つまり、コマンドの代用としてエスケープ文字を使うのか、そうでないのかによります。
<ブロッククオート横から質問です。コマンド置換をネストする場合など、1つのスクリプトで両方の形式を使用することはバッドプラクティスですか?
まあ、スクリプトを読むのは多少楽になるかもしれませんが(タイポグラフィ的に)、理解するのは難しいです。あなたのスクリプトを読む人(あるいは半年後に読むあなた!)は、なぜどちらかの形式にこだわらなかったのかと疑問に思うでしょう--なぜそうしたのか、コメントに書いてあれば別ですが。さらに、1つのスクリプトに両方の形式を混在させると、そのスクリプトは移植性が低くなります。スクリプトが正しく動作するためには、スクリプトを実行するシェルがどちらか一方だけでなく両方の形式をサポートしていなければなりません。
シェルスクリプトを理解しやすくするために、個人的には、技術的に十分な理由がない限り、1つのスクリプトを通してどちらかの形式にこだわることをお勧めします。さらに、技術的に十分な理由がない限り、古い形式よりもPOSIX形式の方が好ましいと思います。
コマンド代替のトピックとそれを行うための2つの異なる形式については、RobbinsとBeebeによるO'Reilly book "Classic Shell Scripting, " second editionのコマンド代替についてのセクションを参照することをお勧めします。この本に金銭的な利害はありません。この本は私が持っている(そして大好きな)シェルスクリプトの本ですが、どちらかというと中級や上級のシェルスクリプト向けで、シェルスクリプトの初級者にはあまり向いていないようです。
-B.
関連
-
[解決済み] find -exec cp {} でエラー 'find: missing argument to -exec' が発生した場合の解決策。TARGET_DIR + [閉店]。
-
[解決済み] Bashで$()と`の違いはあるのでしょうか?重複] [重複
-
[解決済み] OS X で 'find' コマンドを使用して 'sed' を使用するとエラーが発生する。"無効なコマンドコードです。"
-
[解決済み] Homebrewは最新ですが、`could not link` + `delete path` のエラーは気にしなくていいのでしょうか?
-
[解決済み] awk で行を飛ばすにはどうしたらいいですか?
-
[解決済み] ConcatenationとAppendの違いについて【終了しました
-
[解決済み] シンタックスエラー」が発生しました。"(" unexpected' (expecting "done") [duplicate]".
-
[解決済み] IPアドレスのまとめ方
-
[解決済み] 特殊なドル記号のシェル変数とは何ですか?
-
[解決済み] シェルでドル記号と括弧の中にコマンドを入れるとはどういう意味か: $(command)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「ambiguous redirect」エラーが発生する
-
[解決済み】シェルスクリプトで整数式が期待されるエラーが発生する
-
[解決済み] MacOSのbashターミナルでexport PS1="\u[\033[m]@[\033[32m]\h:\[\033[33;1m]\w[\033[m]\$" は何を意味していますか?
-
[解決済み] etc/profileでVISIBLE=NOWを設定するのはなぜですか?
-
[解決済み] OS X で 'find' コマンドを使用して 'sed' を使用するとエラーが発生する。"無効なコマンドコードです。"
-
[解決済み] Bashスクリプトで引数を反復処理する方法
-
[解決済み] sed で二重引用符と単一引用符をエスケープするにはどうしたらいいですか?
-
[解決済み] IPアドレスのまとめ方
-
[解決済み] 環境変数を表示/エコーするには?
-
[解決済み】シェルプログラミングにおける$(command)と`command`の違いは?