Bashでスクリプトを作成するときに、次の構造を使用してコマンド出力に変数を割り当てる方法を学びました。
variable=$(command-string)
これをコマンド置換と呼び、サブシェル環境でコマンド文字列の内容を実行します。
何か異常な点を見つけたかもしれません。
この形式のコマンド置換を実行するときに変数の割り当てがない場合、結果は異なります。
例:
cmd=date
var=$(echo $cmd)
echo $var
$(echo $cmd)
出力:
date
Fri Jun 29 15:11:58 EDT 2018
変数割り当てなしのコマンド置換は、コマンド実行の標準出力を評価したいようですが、変数割り当てはそうではありません。
答え1
コマンド置換は次のように評価されます。date
何も割り当てていないので、デフォルトではdate
コマンドプロンプトに入力するだけです。
$ set -x
$ cmd=date
+ cmd=date
$ var=$(echo $cmd)
++ echo date
+ var=date
$ echo $var
+ echo date
date
$ $(echo $cmd)
++ echo date
+ date
Fri Jun 29 13:26:55 MDT 2018
date
有効なコマンドなので、期待どおりに実行されます。
答え2
私は合理的でやや簡潔な技術的な説明を思いついたと思います。我々はコマンドラインインタプリタ(CLI)を扱っており、パーサーが代替マーク「$(」に会ったときの解釈ステップによってコマンド置換の結果が異なります。
cmd="date"
単純な割り当て;変数「cmd」には文字列「date」があります。
var=$(echo $cmd)
$(echo $cmd)
最初のケースでは、パーサー(左から右に読み取る)はトークン「=」を見つけ、変数の割り当てに対応する文字列を待っていることに気づきます。 2番目の場合、パーサーが "$("に達すると、パーサーは処理中のコマンドのタイプをまだ決定していません。どちらの場合も、構文解析が一時停止され、サブシェル環境が生成されます。)角括弧の間の文字列stdoutの内容同じ引用符を持たない対応する閉じ括弧「$(」とその間のすべての項目を置き換えるためにCLIによって解釈されます。今後、CLIは中断された部分から続きます。複数の文字列 "date"が含まれています。最初の場合、CLIは同等の文字列を期待しているため、 "var = date"を文字列 "date"を変数 "var"に割り当てると解釈します。現時点では、プログラムで有効なプログラムとして解釈されます。