コマンド置換には、2つの構文があります:ドル括弧とバッククォートを使用します。実行するtop -p $(pidof init)
とtop -p `pidof init`
、同じ出力が得られます。これら2つの方法は同じことですか、それとも違いがありますか?
コマンド置換には、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は` `
自分の目的のために使用します、この答えを書くのは苦労しました:)
{ }
通常、「中括弧」または「ブレース」と呼ばれているen.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
はデッドキーです。そのため、二重バックティック(通常は忘れることができること)またはバックティックを入力する必要があります。疼痛。
私が観察する明らかな違いは、あなたが巣を作ることができる間、あなたがbackticksを巣に入れることができないことです$()
。おそらく両方がレガシーの理由で存在します。同様に、.
とsource
コマンドは同義語です。
source
。ダッシュはその一例です。
$(...)
と`...`
(後者は廃止されている)標準であり、一方が.
標準ではなく、source
(t)csh
入れ子にすることはできません。ただし、(t)csh
サポートしません$(...)
。ただし、サポートしますsource
(サポートしません.
)。
もう1つの注意事項は、$()
バックティックを使用するよりも多くのシステムリソースを使用しますが、わずかに高速です。
でマスタリングUnixシェルスクリプト、ランダルK.マイケルは、「ファイルの行ごとを処理する24個の方法」という名前の章のテストを行っていました。
$()
スクリプトを使用した場合よりも1バイト大きくするためだと思います`
(ネストせず、バックスラッシュを使用しないと仮定)。どちらを解析するのが速いかについては、シェル間で異なり、パイプの作成とコマンド置換に伴うプロセスの分岐のコストと比較すると無視できるほど重要ではありません。
ここで他の人が言ったことに追加するには、バックコメントを使用してインラインコメントをシミュレートできます。
echo foo `# I'm a comment!` bar
出力は次のとおりfoo bar
です。
詳細については、次を参照してください。https : //stackoverflow.com/a/12797512(その投稿の下のコメントにも注意してください。)
この$()
構文は、古いbourneシェルでは機能しません。
新しいシェル` `
で$()
は同等で$()
あり、複数のコマンドをネストする必要がある場合に使用する方がはるかに便利です。
例えば :
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
を入力してデバッグするのは簡単です:
echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``