FOO = bar;変数を私の環境にエクスポートするのはなぜですか?

FOO = bar;変数を私の環境にエクスポートするのはなぜですか?

走れば

FOO=bar docker run -it -e FOO=$FOO debian env

このコマンドのコマンド出力には環境変数は設定されていませんenv

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=03f3b59c0aab
TERM=xterm
FOO=
HOME=/root

しかし、私が走ったら

FOO=bar; docker run -i -t --rm -e FOO=$FOO debian:stable-slim env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=672bfdcde93c
TERM=xterm
FOO=bar
HOME=/root

その後、変数をコンテナから取得し、現在のシェル環境にエクスポートすることもできます。

echo $FOO
bar

この動作を予想しましたが、export FOO=barなぜこれが起こりますか;

ベストアンサー1

いいえ、FOO =バー;確かに私の環境に変数をエクスポートする

varは、以前にエクスポートされた場合にのみ(現在の)環境に設定されます。

$ export foo
$ foo=bar
$ env | grep foo
foo=bar

変数がコマンドの前に配置されると、その変数はコマンド環境に設定されます。良いfoo=bar command。コマンドの実行中にのみ存在します。

$ foo=bar bash -c 'echo "foo is = $foo"'
foo is = bar

varがコマンドラインに設定されていません(現在のシェルで):

$ foo=bar bash -c echo\ $foo

上記の値は$foo次のように置き換えられます。現在実行中のシェルしたがって、出力はありません。

あなたの命令:

$ FOO=bar docker run -it -e FOO=$FOO debian env

実際の文字列に変換:

$ FOO=bar docker run -it -e FOO= debian env

現在実行中のシェルを介して

逆に、現在実行中のシェルでコマンドを実行する前に変数を設定すると、その行foo=barは次のように変換されます。

$ FOO=bar; docker run -it -e FOO=bar debian env

コマンドが返されると、コマンド環境に設定された変数が削除されます。

$ foo=bar bash -c 'echo'; echo "foo was erased: \"$foo\""

とは別にコマンドがいくつかの条件/シェルに組み込まれているコマンドの場合:

$ ksh -c 'foo=bar typeset baz=quuz; echo $foo'
bar

おすすめ記事