2017-12-20 10 views
2

내가 알아 내기 위해 노력하고있어. 내가 (마지막에 면책 조항을 생략하지 마십시오!) var 변수가 command의 환경에 전달 될 것으로 예상하지만, 현재의 환경에 존재하지 않아야

먼저, bash는 그것을 시도하자한 줄의 설정 환경 변수 및 실행 명령에 diffferent 결과를 얻은 oneliner</p> <pre><code>var=value command </code></pre> <p>실제로 SH 어떻게 작동하는지, sh와 bash는

#bash 
$ var=  #just to be sure it's empty 
$ var=value echo something 
. something 
$ echo "$var" 
. 

$ var=value set something 
$ echo "$var" 
. 

현재로서는 예상대로 작동합니다. 그러나 우리가 sh에 가고 동일한 입력을 다시 입력 할 때, 그것은 그것과 같을 것입니다 :

그리고 마지막 하나는 다릅니다. set 명령에 sh의 특별한 경우가 있습니까? 변수 var이 현재 환경에 저장되는 이유는 무엇입니까?

면책 조항 : 나는 echoset 우리가 var=value command으로 전달할 쉘 내장의 때문에 환경 변수가 낭비되는 것을 알고 있지만, 내 질문은 구문에 관한 것입니다. 내 말은, 그들은 일 것입니다,하지만, sh에서, 입력했을 때 set, 변수는 어떻게 든 현재 환경으로 전달되었습니다.

답변

5

set은 POSIX 사양 에서처럼 "특별"내장되어 있습니다.

단순 명령에서 설명한대로 특수 내장 유틸리티를 호출하기 전에 변수를 할당하면 내장이 완료된 후에도 그대로 유지됩니다. 이것은 일반적인 내장 또는 다른 유틸리티의 경우에는 해당되지 않습니다.

따라서이 경우 bash은 실제로 POSIX 사양을 위반합니다. POSIX 모드에서 실행하면 sh과 같게 동작합니다.

$ bash --posix 
$ var=value set something 
$ echo $var 
value 
+0

우수 답변. 그냥 궁금 해서요.이 특별한 경우의 행동이 좋은 아이디어 인 이유를 생각해 볼 수 있습니까? var = value를 통해 특별한 경우없이 같은 결과를 얻을 수 있습니다. 무언가를 세워라. – John1024

+0

쉘에 왜 영향을 미치는지 반드시 확신 할 수 없습니다. 특수 내장 명령으로 분류 된 명령은 효율성을 위해 선택적으로 내장되는 것보다는 셸에 영향을주는 명령이기 때문에 내장 명령이 필요하다는 점에 유의할 것입니다. 따라서 별도의 명령을 실행하지 않으므로 할당이 일시적이라는 것은 의미가 없습니다. – chepner