コマンドの前に「ワンタイム変数の割り当て」を付けたときに変数を bash 拡張しないのはなぜですか?

コマンドの前に「ワンタイム変数の割り当て」を付けたときに変数を bash 拡張しないのはなぜですか?

このbashコマンドを実行し、ステートメントの前にプレフィックスを付けた場合、変数はfruitこのコマンドの実行中にのみ存在する必要があります。

$ fruit=apple echo $fruit

$

結果は空行です。なぜ?

ワイルドカードを引用したコメントこの問題:

パラメータ拡張はシェルによって実行されます。 「fruit」変数はシェル変数ではなく、「echo」コマンド環境の環境変数にすぎません。

環境変数はまだ変数なので、echoコマンドで使用できますか?

ベストアンサー1

問題は、現在のシェルが変数を早期に拡張することです。そのコンテキストに設定されていないため、コマンドにecho引数がありません。つまり、コマンドは次のようになります。

$ fruit=apple echo

一重引用符で変数が早期に拡張されないようにする回避策は次のとおりです。

$ fruit=apple sh -c 'echo $fruit'

fruitあるいは、変数が実行されたコマンドに正しく渡されたことを示す1行のシェルスクリプトを使用することもできます。

$ cat /tmp/echof
echo $fruit
$ /tmp/echof

$ fruit=apple /tmp/echof
apple
$ echo $fruit

$

この問題は予期しない議論と議論を引き起こしたため、いくつかのコメントは次のとおりです。

  • 変数fruitをエクスポートしたかどうかは、その動作には影響しません。重要なのは、シェルが変数を拡張する正確な瞬間の変数値が何であるかです。
$輸出フルーツ=バナナ
$fruit=アップルエコ $fruit
バナナ
  • このコマンドが組み込まれているという事実は、echoOPの質問には影響しません。ただし、場合によっては、この構文で組み込み関数またはシェル関数を使用すると、次のような予期しない副作用が発生する可能性があります。
$輸出フルーツ=バナナ
$fruit=apple 評価 'echo $fruit'
りんご
$echo$フルーツ
りんご
  • 2つの間に類似点がありますが、ここに尋ねる質問そしてそれはまったく同じ質問ではありません。もう一つの質問として、IFSシェル噴射 その他$varここで変数、fruit一時変数の値は、シェル実行時にはまだ使用できません。拡大するこれ同じ変える

  • しかも別の問題OPは使用された構文の重要性について尋ねています。ここで、OPは重要性を認識しますが、予期しない動作を報告し、その理由を尋ねます。つまり、「これはなぜ機能しないのですか?」まあ、他の質問に掲示された都合のないスクリーンショットをもう少し注意深く読んだ結果、そこにも実際に同じ状況が説明されているので( BAZ=jake echo $BAZ) はい、結局重複です。

おすすめ記事