バックティックを理解する( `)


35

私はコマンドを試しています

$ b=5; echo `$b`;
-bash: 5: command not found

ただし、想定どおり5は出力されません。ここに何が欠けていますか?

コマンドで `(バッククォート/バックティック)はどういう意味ですか?`内のコマンドを評価し、それらを出力に置き換えると言っているようです。


8
ネストされた実行置換を実行する機能が失われるため、バックティックは推奨されません。Insetad、$(somecommand)が推奨されます。私見それは読みやすさを向上させます。
トミー

6
@Tommy、いいえ、バックティックはネストできますが、特に二重引用符を使用する場合は、逃げる悪夢になります。
ステファンシャゼラス

回答:


52

バッククォート間のテキストは実行され、コマンドの出力に置き換えられます(末尾の改行文字を除く。出力にNUL文字があるとシェルの動作が異なることに注意してください)。これは、コマンドの出力で置換されるため、コマンド置換と呼ばれます。したがって、5を印刷する場合は、逆引用符を使用できません。echo "$b"引用符を使用できますecho $b

ご覧のとおり、$b5が含まれているので、backticksを使用bashするとコマンドを実行しようとし5、そのようなコマンドがないため、エラーメッセージで失敗します。

バックティックの動作を理解するには、これを実行してみてください:

$ A=`cat /etc/passwd | head -n1`
$ echo "$A"

cat /etc/passwd |head -n1/etc/passwdファイルの最初の行を印刷する必要があります。しかし、バックティックを使用しているため、コンソールにこれを印刷しません。代わりに、A変数に保存されます。$Aこれにエコーできます。最初の行を印刷するより効率的な方法はコマンドを使用head -n1 /etc/passwdすることですが、バックティック内の式は単純である必要はないことを指摘したかったことに注意してください。

したがって、/ etc / passwdの最初の行がの場合root:x:0:0:root:/root:/bin/bash、最初のコマンドはbashによって動的に置き換えられA="root:x:0:0:root:/root:/bin/bash"ます。

この構文はBourneシェルのものであることに注意してください。引用とエスケープは、特にネストを開始した場合、すぐに悪夢になります。Ksh $(...)は、現在標準化され(POSIX)、すべてのシェル(Unix v9のBourneシェルも含む)でサポートされている代替を導入しました。したがって$(...)、非常に古いBourneシェルに移植する必要がない限り、今日では代わりに使用する必要があります。

また、との出力は`...`$(...)変数展開(zshでの単語分割のみ)と同様に、単語分割とファイル名生成の対象となるため、通常、リストコンテキストで引用符で囲む必要があります。


1
こんにちは@Krzysztof、それは役に立ちます!「$ bは5が含まれているので、bashはコマンド5を実行しようとしている」私が探していたまさにです
coolcric

you can use quotation marks, like echo "$b"=> ""は特別なことをしますか?そうですecho $b、同じようにうまくいくでしょう。
トッツィーロールス

@Anita:一般に引用符はいくつかの特別なことを行います(特殊文字の処理方法、特に空白文字を変更します)が、この場合、問題なくドロップできます。これは、特殊文字が使用されechoておらず、コマンドが取得する引数の数を気にしないため、b内部にスペースがある場合、複数の引数を取得し、それらを引き続き出力するためです。これは他のコマンドには当てはまらない可能性があります(特に変数が設定されていない場合)ので、私は常に変数を引用符で囲む傾向があります。
クシシュトフアダムスキー

(POSIX)実際の標準へのリンクであればいいでしょう。
erikbwork

1
@ erikb85:このメモは私が追加したものではありませんが、あなたが示唆したようにリンクで編集しました:)
Krzysztof Adamski

11

バックティックは、まさにあなたが言うことをします。変数を整数に設定しました。その変数をバックティック内に配置すると、bashはそれをコマンドとして実行しようとします。コマンドではないため、見たエラーが発生します。

あなたがしたいことは単純です:

$ b=5; echo $b

バックティックをよりよく理解するには、以下と比較してください。

$ b=5; a=`echo $b`; echo $a
  5

8

行ごとに説明する必要があります。

$ b=5; echo `$b`;
  1. 変数bを5に設定します
  2. 評価する$b(効果的に実行する5
  3. echo上記の評価の出力。

そう、あなたが得た出力は期待されています。あなたが思っていた実際のコマンドではなく、変数の内容を評価しています。バックティック内に入れたものはすべて、新しい(サブ)シェルで単純に評価(実行)されます。


こんにちは、@ gertvdijk、投稿ありがとう!その内容を評価した後に、 `が残されたものをすべて返すと考えていました。だから、私はエコーがそれを印刷するために`$ b」は5を返しただろうと思った
coolcric
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.