env, setenv, export 및 사용시기의 차이점은 무엇입니까?


18

최근 환경 변수를 설정하는 3 가지 옵션이 있음을 알았습니다.

  1. export envVar1=1
  2. setenv envVar2=2
  3. env envVAr3=3

다른 방법이 있으면 우리를 계몽하십시오.

언제 다른 것을 선호해야합니까? 지침을 제안하십시오.

쉘 호환성에 관해서는, 가장 광대 한 것은 무엇입니까?

나는 이미이 답변을 보았지만 질문 env과 사용 환경 설정 지침 을 확장하고 싶습니다 .

답변:


14

export VARIABLE_NAME='some value'어떤 POSIX 호환 쉘 (의 환경 변수를 설정하는 방법이며 sh, dash, bash, ksh, 등; 또한 zsh을). 변수에 이미 값이 있으면 값 export VARIABLE_NAME을 변경하지 않고 환경 변수로 만들 수 있습니다 .

POSIX 이전 Bourne 쉘 은이를 지원하지 않으므로 대신 피하고 export VARIABLE_NAME='some value'사용 VARIABLE_NAME='some value'; export VARIABLE_NAME하는 스크립트가 표시 됩니다. 그러나 POSIX 이전 Bourne 쉘은 오늘날 매우 드 rare니다.

setenv VARIABLE_NAME='some value'환경 변수를 설정하는 csh 구문입니다. setenvsh에는 존재하지 않으며 csh는 스크립트에서 거의 사용되지 않으며 지난 20 년 동안 대화식으로 사용하기 위해 bash (및 zsh는 훨씬 더 길다)를 넘어 섰으므로 접하지 않는 한 잊어 버릴 수 있습니다.

env명령은 shebang 행을 제외하고는 거의 유용하지 않습니다 . 인수없이 호출하면 환경이 표시되지만 export더 잘 수행됩니다 (정렬되고 종종 값을 구분하는 줄 바꿈에서 값의 줄 바꿈을 명확하게 인용합니다). 인수로 호출 할 때, 추가 환경 변수로 명령을 실행되지만없이 같은 명령은 env또한 (작업 VAR=value mycommand실행을 mycommand함께 VAR하도록 설정 value처럼 env VAR=value mycommand). envshebang 행에서 유용한 이유 는 PATH검색 을 수행 하고 명령 이름으로 호출 될 때 다른 작업을 수행하지 않기 때문입니다. 이 env명령은 몇 가지 환경 변수만으로 명령을 실행하는 데 유용 할 수 있습니다.-i또는 셸에서 가져 오지 않은 잘못된 이름의 변수를 포함하여 환경을 표시하는 매개 변수가없는 경우.


3

같은 변수를 설정하면 VAR='asdf'환경이 수정되지 않습니다. 즉, 동일한 세션에서 실행하는 프로그램은 그에 대해 아무것도 알지 VAR못하고 액세스 할 수 없습니다. 쉘 스크립트를 작성할 때이 동작을 원합니다.

export반면에, 환경을 수정하여 현재 세션에서 생성 된 자식 프로세스에 대해 내 보낸 변수를 볼 수있는 bash 내장입니다. 을 실행하여 동일한 결과를 얻을 수 있습니다 VAR='asdf' %program_name%.

env내장 된 것이 아니라 프로그램 자체입니다. 표면적으로는 당신과 똑같이 작동 VAR='asdf' %program_name%하지만, 낮은 수준에서는 상황이 조금 더 복잡해집니다. 먼저, env시작됩니다. 환경을 수정 한 다음 주어진 인수로 명령을 실행합니다. exec (3) 시스템 호출 을 사용하여 자신의 코드에서 달성 할 수있는 것과 동일한 동작 입니다.

setenv그냥 export당신의 대답에 명시된 바와 같이, CSH-가족 껍질에.


2
현대 쉘에서는 이미 VAR=asdf환경에있는 경우 환경을 업데이트 VAR합니다. (이것은 원래 Bourne 쉘에서는 사실이 아니 었습니다.)
Gilles 'SO- 악마 그만해'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.