コマンド代替構文には、ドル角かっことバックティックを使用する2つの構文があります。実行しtop -p $(pidof init)
、top -p `pidof init`
同じ出力を提供します。これら2つの方法は同じことをしますか、それとも違いがありますか?
答え1
以前のスタイルのバックティックは、` `
バックスラッシュとネストを少し異なる方法で処理します。新しいスタイルは$()
その間のすべてを( )
コマンドとして解釈します。
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- 一貫したシェル。
〜のように映画で古いシェルにはレガシーが` `
必要な場合があります。
技術的な観点に加えて、以前のスタイルには` `
視覚的な欠点もあります。
- 目立つのは難しいです。
I like $(program) better than `program`
- 一重引用符と混同しやすいです。
'`'`''`''`'`''`'
- 入力するのは非常に簡単ではありません(おそらくキーボードの標準レイアウトでも発生しません)
(SE` `
自体の目的のために、この答えを書くのは痛かったです。)
答え2
私が観察した明らかな違いは、逆引用符を入れ子にできないことです$()
。おそらく、両方ともレガシーな理由で存在する可能性があります。同様に.
、source
コマンドは同義語です。
答え3
$()
以前のBourneシェルでは機能しません。しかし、古いBourneシェルを使用してから数十年が経ちました。
答え4
また、$()
バックティックを使用するよりも多くのシステムリソースを使用しますが、少し高速です。
存在するマスターUnixシェルスクリプトRandal K. Michaelは、「ファイルを1行ずつ処理する24の方法」の章でテストを実行します。