web-dev-qa-db-ja.com

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

コマンドを試しています

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

本来の5は印刷されません。ここで何が欠けていますか?

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

37
coolcric

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

ご覧のとおり、_$b_には5が含まれているため、バックティックを使用すると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"_に置き換えられます。

この構文はボーンシェルのものであることに注意してください。特にネストを開始すると、引用とエスケープはすぐに悪夢になります。 Ksh $(...)代替が導入されました。これは現在標準化されており( [〜#〜] posix [〜#〜] )、すべてのシェルでサポートされています( Unix v9のBourneシェルも同様です。そのため、非常に古いBourneシェルに移植可能である必要がない限り、今日では代わりに$(...)を使用する必要があります。

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

55

バックティックは、あなたが言うとおりに動作します。変数を整数に設定しました。その変数をバッククォート内に置くと、bashはそれをコマンドとして実行しようとします。コマンドではないため、表示されたエラーが発生します。

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

$ b=5; echo $b

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

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

ステップバイステップであなたの行はそれを説明する必要があります。

$ b=5; echo `$b`;
  1. 変数bを5に設定します
  2. $bを評価します(実際には5を実行します)
  3. echoes上記の評価の出力。

だから、はい、あなたが得た出力は期待されています。変数の内容を評価しているのであって、あなたが思っていた実際のコマンドではありません。バックティック内に配置したものはすべて、新しい(サブ)シェルでsimplay評価(実行)されます。

8
gertvdijk