1. ホーム
  2. bash

[解決済み] コマンド置換:バックティックまたはドル記号/ペレンで囲む?重複

2022-04-21 14:12:53

質問

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.