2017-12-10 7 views
1
내가 아무것도 없어 'ENV'명령 내부 에코 변수를 노력하고 있어요,하지만 난 그게 '하려면 printenv'명령을 사용하여 볼 수 있습니다

:이상한 행동

[email protected]:~# env xxx=23 echo $xxx 

[email protected]:~# env xxx=23 printenv | grep xxx 
xxx=23 

잘못 여기에 무엇을 ?

답변

4
env xxx=23 echo $xxx 

는 쉘 $xxx 평가한다. 따라서 아무 것도 울리지 않습니다.

보다 구체적으로, 쉘은 env, xxx=23, echo$xxx이라는 4 개의 단어를 보게됩니다. 명령 이름으로 env을 해석하고 env 명령에 전달할 세 개의 인수로 xxx=23, echo$xxx을 해석합니다. $xxx 전에 env으로 전달하기 전에 평가합니다.

대조적으로, 다음에서는 쉘이 평가할 쉘 변수가 없습니다. 대신 envxxx=23printenv의 두 인수로 실행됩니다. env 환경 변수 xxx을 설정하고 printenv 실행 :

$ env xxx=23 printenv | grep xxx 
xxx=23 

을 마찬가지로 관찰 : $xxx 작은 따옴표 내부

$ env xxx=23 sh -c 'echo $xxx' 
23 

때문에, 쉘을 평가하지 않는다. 대신 xxx=23, sh, -cecho $xxx의 4 가지 인수를 사용하여 을 실행하십시오. env이 환경 변수 xxx을 설정 한 후 -cecho $xxx 인수를 사용하여 sh을 실행합니다. $xxxsh이 실행될 때 평가되므로 변수 xxx이 표시됩니다.

1

env xxx=23 echo $xxx을 실행하면 변수 xxx=23이 실행 중에 echo 프로세스에서 볼 수있게됩니다. echo $xxx에서 $xxx의 값은 echo으로 계산되지 않고 이며 현재 실행중인 셸에서 계산됩니다. 그리고 env ... 호출이 현재 쉘에 영향을 미치지 않으므로, 이 값을 $xxx으로 설정하면이 명령을 실행하기 전 (어쩌면 설정되지 않은 상태)이됩니다.

echo 당신이 echo 명령이 환경에 정의 된 특정 값을 출력 할 수 없기 때문에 env, 의 효과를 테스트 할 수있는 좋은 방법이 아니다. 예를 들어 printenv을 사용하는 것이 더 좋으며, 알고있는 환경 변수의 내용을 덤프하기 때문에 입니다. 또 다른 좋은 테스트는 @hohn이 그의 답변에서 쓴 것입니다. 은 다른 쉘을 호출하고 쉘이 선택한 환경 변수를 인쇄하도록합니다. 환경 변수의 내용을 인쇄 할 수있는 프로그램이 있으면 효과가 있습니다. env이 실행되기 전에 상기에서