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

답변2

고려해야 할 다양한 변형이 있습니다.

  1. 단순히 value 라는 변수를 생성하면 FOO=bar해당 변수가 새 프로세스에 전달되지 않습니다.FOObar

    $ 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
    
  2. 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
    $
    
  3. (1)과 동일한 작업을 수행하면 FOO=foo; <command>두 명령 사이에 세미콜론을 추가하는 것은 두 명령을 별도의 두 줄에서 실행하는 것과 같습니다.

    $ FOO=foo; echo $FOO
    foo
    $ bash
    $ echo $FOO
    
    $ exit
    exit
    $ echo $FOO
    foo
    $
    
  4. 을 사용하면 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=barcmddocker내 자신의환경을 컨테이너에 추가해야 하지만 환경 변수는 스위치를 사용하여 명시적으로 추가해야 합니다 -e.

다시 한 번 더 간단한 데모는 다음과 같습니다.

FOO=before
FOO=after env - FOO=$FOO printenv FOO
=> before

관련 정보