[email protected]:~# env xxx=23 echo $xxx
[email protected]:~# env xxx=23 printenv | grep xxx
xxx=23
잘못 여기에 무엇을 ?
[email protected]:~# env xxx=23 echo $xxx
[email protected]:~# env xxx=23 printenv | grep xxx
xxx=23
잘못 여기에 무엇을 ?
env xxx=23 echo $xxx
는 쉘 $xxx
평가한다. 따라서 아무 것도 울리지 않습니다.
보다 구체적으로, 쉘은 env
, xxx=23
, echo
및 $xxx
이라는 4 개의 단어를 보게됩니다. 명령 이름으로 env
을 해석하고 env
명령에 전달할 세 개의 인수로 xxx=23
, echo
및 $xxx
을 해석합니다. $xxx
을 전에 env
으로 전달하기 전에 평가합니다.
대조적으로, 다음에서는 쉘이 평가할 쉘 변수가 없습니다. 대신 env
은 xxx=23
및 printenv
의 두 인수로 실행됩니다. env
환경 변수 xxx
을 설정하고 printenv
실행 :
$ env xxx=23 printenv | grep xxx
xxx=23
을 마찬가지로 관찰 : $xxx
작은 따옴표 내부
$ env xxx=23 sh -c 'echo $xxx'
23
때문에, 쉘을 평가하지 않는다. 대신 xxx=23
, sh
, -c
및 echo $xxx
의 4 가지 인수를 사용하여 을 실행하십시오. env
이 환경 변수 xxx
을 설정 한 후 -c
및 echo $xxx
인수를 사용하여 sh
을 실행합니다. $xxx
은 sh
이 실행될 때 평가되므로 변수 xxx
이 표시됩니다.
env xxx=23 echo $xxx
을 실행하면 변수 xxx=23
이 실행 중에 echo
프로세스에서 볼 수있게됩니다. echo $xxx
에서 $xxx
의 값은 echo
으로 계산되지 않고 이며 현재 실행중인 셸에서 계산됩니다. 그리고 env ...
호출이 현재 쉘에 영향을 미치지 않으므로, 이 값을 $xxx
으로 설정하면이 명령을 실행하기 전 (어쩌면 설정되지 않은 상태)이됩니다.
echo
당신이 echo
명령이 환경에 정의 된 특정 값을 출력 할 수 없기 때문에 env
, 의 효과를 테스트 할 수있는 좋은 방법이 아니다. 예를 들어 printenv
을 사용하는 것이 더 좋으며, 알고있는 환경 변수의 내용을 덤프하기 때문에 입니다. 또 다른 좋은 테스트는 @hohn이 그의 답변에서 쓴 것입니다. 은 다른 쉘을 호출하고 쉘이 선택한 환경 변수를 인쇄하도록합니다. 환경 변수의 내용을 인쇄 할 수있는 프로그램이 있으면 효과가 있습니다. env
이 실행되기 전에 상기에서