コマンド置換には、ドル括弧とバックティックの2つの構文があります。 top -p $(pidof init)
およびtop -p `pidof init`
を実行しても同じ出力が得られます。これらの2つの方法は同じことをしますか、それとも違いがありますか?
古いスタイルのバッククォート_` `
_は、バックスラッシュとネストを少し異なります。新しいスタイルの$()
は、_( )
_の間のすべてをコマンドとして解釈します。
_echo $(uname | $(echo cat))
Linux
echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat
_
ネストされた逆引用符がエスケープされている場合に機能します。
_echo `uname | \`echo cat\``
Linux
_
バックスラッシュの楽しみ:
_echo $(echo '\\')
\\
echo `echo '\\'`
\
_
新しいスタイルの$()
は、すべての [〜#〜] posix [〜#〜] -適合シェルに適用されます。
mouviciel が指摘したように、古いシェルでは古いスタイルの_` `
_が必要になる場合があります。
技術的な観点とは別に、古いスタイルの_` `
_には視覚的な欠点もあります。
I like $(program) better than `program`
'`'`''`''`'`''`'
_(およびSEは_` `
_を独自の目的で使用しているため、この回答を書くのは大変でした:)
私が観察している明らかな違いは、$()
をネストできる間はバックティックをネストできないことです。おそらく両方ともレガシーの理由で存在しています。同様に、.
およびsource
コマンドは同義語です。
$()
は、古いBourne Shellでは機能しません。しかし、 年 私が古いBourne Shellで働いてから数十年。
別のメモ、$()
は、バックティックを使用するよりも多くのシステムリソースを使用しますが、少し高速です。
Mastering Unix Shell scripting では、Randal K. Michaelが「ファイルを1行ずつ処理する24の方法」という章でテストを行いました。
ここで他の人が言ったことに追加するには、バックティックを使用してインラインコメントをシミュレートできます。
echo foo `# I'm a comment!` bar
出力は次のとおりです:foo bar
。
詳細については、以下を参照してください。 https://stackoverflow.com/a/12797512 (その投稿の下のコメントにも注意してください。)
$()
構文は、古いボーンシェルでは機能しません。
新しいシェルでは、_` `
_と$()
は同等ですが、複数のコマンドをネストする必要がある場合は、$()
を使用すると便利です。
例えば :
_echo $(basename $(dirname $(dirname /var/adm/sw/save )))
_
入力とデバッグが簡単です:
_echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``
_