以前は次のようなことができました:
X=123 cat <<EOF
X is $X
EOF
あるいはもっと簡単に言うと:
X=123 echo $X
最初のものは、bash 修正プログラムをインストールした後も Mac OS X で動作するようですが、AWS の Ubuntu 14.04 インスタンスではどちらも動作しないようです。なぜこのようなことが起こるのでしょうか。あるいは、これらの環境変数にアクセスできなくなったのでしょうかecho
。cat
さらに奇妙なことに、env 変数を 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.