私は次のことができました:
X=123 cat <<EOF
X is $X
EOF
はるかに簡単です。
X=123 echo $X
bashの修正をインストールした後でも、最初の修正はまだMac OS Xで動作するようですが、AWSのUbuntu 14.04インスタンスでは動作しなくなったようです。これらの環境変数にアクセスできecho
なくcat
なったのはなぜですか?もう1つのことは、NodeJSアプリケーションに環境変数を渡すときに問題がないようです。
cat <<EOF > test.js
console.log('X is ' + process.env.X);
EOF
X=123 node test.js
これはbashスクリプトでも動作するようです。
cat <<EOF > test.sh
echo X is \$X
EOF
chmod +x test.sh
X=123 ./test.sh
答え1
POSIXシェルで以下を作成するとき
X=123 echo $X
$X
コマンド全体を実行する前に拡張されます。つまり、最初に設定されていない場合は、次のように$X
なります。
X=123 echo
次に実行します。シェルが実行する操作をおおよそ見ることができますset -x
。
$ set -x
$ X=123 echo X=$X
+ X=123
+ echo X=
X=
$ set +x
環境に引き続きアクセスできることを確認できますecho
(実際に実行する前に拡張されるシェル自体)。echo
$ X=123 eval 'echo $X'
123
問題はcat <<EOF
似ています。関連して、以前のbash
バージョン(4.1より前)には、CHANGES
ドキュメントに次のようなバグがあります。
ここでは、ドキュメントの変数が一時的な環境で見えるように拡張されるバグを修正しました。
これがMac OS Xで観察される動作の理由かもしれません。このエラーに頼らないでください。
答え2
ここにある文書に関するあなたの質問は関係がないかもしれません。問題は、bash
拡張と割り当てが同時に実行されることです。したがって、行間はX=123...
ここで文書内の拡張値に影響を与えてはいけません。これは、ディスクリプタとその環境の残りの部分を渡す前に割り当てる必要があるのと同じように、ここでのドキュメントが呼び出し時に設定されてbash
渡される必要がある入力ファイル記述子であるためです。cat
123
$X
cat
execve
考慮する:
X=321; X=123 bash <<HEREDOC
echo "$X is not yet \$X and $$ is not yet \$$."
HEREDOC
出力
321 is not yet 123 and 17134 is not yet 17225.