web-dev-qa-db-ja.com

$(stuff)と `stuff`の違いは何ですか?

コマンド置換には、ドル括弧とバックティックの2つの構文があります。 top -p $(pidof init)およびtop -p `pidof init`を実行しても同じ出力が得られます。これらの2つの方法は同じことをしますか、それとも違いがありますか?

270
tshepang

古いスタイルのバッククォート_` `_は、バックスラッシュとネストを少し異なります。新しいスタイルの$()は、_( )_の間のすべてをコマンドとして解釈します。

_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は_` `_を独自の目的で使用しているため、この回答を書くのは大変でした:)

364
wag

私が観察している明らかな違いは、$()をネストできる間はバックティックをネストできないことです。おそらく両方ともレガシーの理由で存在しています。同様に、.およびsourceコマンドは同義語です。

41
balki

$()は、古いBourne Shellでは機能しません。しかし、  私が古いBourne Shellで働いてから数十年。

28
mouviciel

別のメモ、$()は、バックティックを使用するよりも多くのシステムリソースを使用しますが、少し高速です。

Mastering Unix Shell scripting では、Randal K. Michaelが「ファイルを1行ずつ処理する24の方法」という章でテストを行いました。

6
cuonglm

ここで他の人が言ったことに追加するには、バックティックを使用してインラインコメントをシミュレートできます。

echo foo `# I'm a comment!` bar

出力は次のとおりです:foo bar

詳細については、以下を参照してください。 https://stackoverflow.com/a/12797512 (その投稿の下のコメントにも注意してください。)

5
phk

$()構文は、古いボーンシェルでは機能しません。
新しいシェルでは、_` `_と$()は同等ですが、複数のコマンドをネストする必要がある場合は、$()を使用すると便利です。

例えば ​​:

_echo $(basename $(dirname $(dirname /var/adm/sw/save )))
_

入力とデバッグが簡単です:

_echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``
_
1
Emmanuel