Shellshock bashの修復はechoやcatのような基本的なコマンドラインツールを壊しますか? [コピー]

Shellshock bashの修復はechoやcatのような基本的なコマンドラインツールを壊しますか? [コピー]

私は次のことができました:

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渡される必要がある入力ファイル記述子であるためです。cat123$Xcatexecve

考慮する:

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.

関連情報