走れば
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