내가 달리면
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
답변2
고려해야 할 다양한 변형이 있습니다.
단순히 value 라는 변수를 생성하면
FOO=bar
해당 변수가 새 프로세스에 전달되지 않습니다.FOO
bar
$ echo $FOO $ FOO=bar $ echo $FOO bar $ bash # Start a new bash process $ echo $FOO # Variable is not set in the new process $ exit # Exit new bash process
Run은
FOO=bar <command>
변수 세트를 사용하여 주어진 명령을 실행합니다(그러나 원래 쉘의 환경에는 영향을 미치지 않습니다):$ echo $foo $ FOO=baz bash # start a new bash process $ echo $FOO baz $ exit # exit the new bash process exit $ echo $FOO # No FOO in the original bash process $
(1)과 동일한 작업을 수행하면
FOO=foo; <command>
두 명령 사이에 세미콜론을 추가하는 것은 두 명령을 별도의 두 줄에서 실행하는 것과 같습니다.$ FOO=foo; echo $FOO foo $ bash $ echo $FOO $ exit exit $ echo $FOO foo $
을 사용하면
export
쉘 환경의 변수가 새로 생성된 프로세스로 전달됩니다.$ export FOO=bar $ echo $FOO # Value set in original shell bar $ bash # Start another shell $ echo $FOO bar # Value was passed along to new process $ exit exit
답변3
FOO=bar docker run -it -e FOO=$FOO debian env
여기 $FOO
에서 FOO=$FOO
확장됩니다.앞으로할당이 FOO=bar
발생합니다.
보다 직접적인 예를 통해 이를 확인할 수 있습니다.
FOO=first
FOO=second echo FOO=$FOO
=> FOO=first
FOO=third; echo FOO=$FOO
=> FOO=third
양식은 환경에서 설정되지만 FOO=bar cmd
이와 같은 명령은 자동으로 내보내지 않습니다.FOO=bar
cmd
docker
내 자신의환경을 컨테이너에 추가해야 하지만 환경 변수는 스위치를 사용하여 명시적으로 추가해야 합니다 -e
.
다시 한 번 더 간단한 데모는 다음과 같습니다.
FOO=before
FOO=after env - FOO=$FOO printenv FOO
=> before