web-dev-qa-db-ja.com

Shellプログラミングの$(command)と `command`の違いは何ですか?

コマンドの出力を変数としてsh/ksh/bashに保存するには、次のいずれかを実行できます。

var=$(command)

または

var=`command`

2つの方法の間に違いがある場合、違いは何ですか?

238
hhafez

$()$()のようにそれ自体の中に簡単にネストできるため、コマンド置換のために$(echo foo$(echo bar))を支持して、バックティック/墓標は廃止されました。バックティック/墓標バージョンでのバックスラッシュの解析方法など、他の違いもあります。

常に$(...)構文を好むいくつかの理由については、 BashFAQ/082 を参照してください。

さまざまな違いの詳細については、 POSIX の仕様も参照してください。

254
SiegeX

彼らは同じように振る舞います。違いは構文的です:``よりも$()をネストする方が簡単です:

listing=$(ls -l $(cat filenames.txt))

vs.

listing=`ls -l \`cat filenames.txt\``
38
John Kugelman

2014年7月: commit f25f5e6 (by Elia Pinto(devzero2000 、2014年4月、Git 2.0)がネストの問題に追加されます:

バッククォート形式は、コマンド置換の従来の方法であり、POSIXでサポートされています。
ただし、最も単純な使用を除くすべてはすぐに複雑になります。
特に、埋め込みコマンドの置換や二重引用符の使用には、バックスラッシュ文字
で慎重にエスケープする必要があります。

git/Documentation/CodingGuidelines が言及している理由は次のとおりです。

コマンドの置換には$( ... )をお勧めします。 」とは異なり、適切にネストします
Bourneが初日から綴った方法だったはずですが、残念ながらそうではありません。

チトンコメント付き

`echo `foo``が開いたり閉じたりできるため、固有のあいまいさのために``が一般に機能しないのはこのためです。
運や特別な機能が原因で、特殊なケースで機能する場合があります。


2016年1月の更新:Git 2.8(2016年3月)は、バックティックを完全に削除します。

commit ec1b76commit 9c10377commit c7b793acommit 80a6b3fcommit 9375dcf を参照してください、 commit e74ef6commit 27fe43ecommit 2525c51commit becd67fcommit a5c98acコミット8c311f9コミット57da049コミット1d9e86fコミット78ba28dコミットefa639fcommit 1be2facommit 38e9476commit 8823d2fcommit 32858acommit cd914d8 (2016年1月12日)by Elia Pinto(devzero2000
浜野邦夫-gitster- in commit e572fef 、2016年1月22日)

Git 2.8以降では、すべて$(...)であり、`...`ではありません。

25
VonC

古いバックティック形式が使用される場合、バックスラッシュは、$、 `、または\が後に続く場合を除き、リテラルの意味を保持します。バックスラッシュが前にない最初のバックティックは、コマンド置換を終了します。

新しい$(command)フォームを使用する場合、括弧で囲まれたすべての文字がコマンドを構成します。特別に扱われるものはありません。

どちらのフォームもネストできますが、バックティックの種類には次のフォームが必要です。

`echo \`foo\`` 

とは対照的に:

$(echo $(foo))
25
ocodo

コマンド内で使用できるエスケープされていない文字を除き、ほとんど違いはありません。 `...`コマンドを$(...) ones(およびその逆)の中に入れることもできます。 )より複雑な2レベルの深さのコマンド置換。

バックスラッシュ文字/演算子の解釈は少し異なります。とりわけ、`...`置換コマンドをネストする場合、次のように内部の`文字をエスケープする必要があります\、一方、$()substitionを使用すると、ネストが自動的に認識されます。

5
DigitalRoss

「2つの方法の間に違いがあるとしたらどうなりますか?」

この動作に注意してください:

A="A_VARIABLE"
echo "$(echo "\$A")"
echo "`echo "\$A"`"

次の結果が得られます。

$A
A_VARIABLE

0
Hiro