コマンドの出力を変数としてsh/ksh/bashに保存するには、次のいずれかを実行できます。
var=$(command)
または
var=`command`
2つの方法の間に違いがある場合、違いは何ですか?
$()
は$()
のようにそれ自体の中に簡単にネストできるため、コマンド置換のために$(echo foo$(echo bar))
を支持して、バックティック/墓標は廃止されました。バックティック/墓標バージョンでのバックスラッシュの解析方法など、他の違いもあります。
常に$(...)構文を好むいくつかの理由については、 BashFAQ/082 を参照してください。
さまざまな違いの詳細については、 POSIX の仕様も参照してください。
彼らは同じように振る舞います。違いは構文的です:``
よりも$()
をネストする方が簡単です:
listing=$(ls -l $(cat filenames.txt))
vs.
listing=`ls -l \`cat filenames.txt\``
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 ec1b76 、 commit 9c10377 、 commit c7b793a 、 commit 80a6b3f 、 commit 9375dcf を参照してください、 commit e74ef6 、 commit 27fe43e 、 commit 2525c51 、 commit becd67f 、 commit a5c98ac 、 コミット8c311f9 、 コミット57da049 、 コミット1d9e86f 、 コミット78ba28d 、 コミットefa639f 、 commit 1be2fa 、 commit 38e9476 、 commit 8823d2f 、 commit 32858a 、 commit cd914d8 (2016年1月12日)by Elia Pinto(devzero2000
) 。
( 浜野邦夫-gitster
- in commit e572fef 、2016年1月22日)
Git 2.8以降では、すべて$(...)
であり、`...`
ではありません。
古いバックティック形式が使用される場合、バックスラッシュは、$、 `、または\が後に続く場合を除き、リテラルの意味を保持します。バックスラッシュが前にない最初のバックティックは、コマンド置換を終了します。
新しい$(command)
フォームを使用する場合、括弧で囲まれたすべての文字がコマンドを構成します。特別に扱われるものはありません。
どちらのフォームもネストできますが、バックティックの種類には次のフォームが必要です。
`echo \`foo\``
とは対照的に:
$(echo $(foo))
コマンド内で使用できるエスケープされていない文字を除き、ほとんど違いはありません。 `...`コマンドを$(...) ones(およびその逆)の中に入れることもできます。 )より複雑な2レベルの深さのコマンド置換。
バックスラッシュ文字/演算子の解釈は少し異なります。とりわけ、`...`置換コマンドをネストする場合、次のように内部の`文字をエスケープする必要があります\、一方、$()substitionを使用すると、ネストが自動的に認識されます。
「2つの方法の間に違いがあるとしたらどうなりますか?」
この動作に注意してください:
A="A_VARIABLE"
echo "$(echo "\$A")"
echo "`echo "\$A"`"
次の結果が得られます。
$A
A_VARIABLE