Mac 10.11.6에서 GNU bash 버전 3.2.57(1)-release(x86_64-apple-darwin15)를 사용하면 이 set +a
명령이 작동하지 않는 것 같습니다.
script.py
#!/usr/bin/python
import os
print("VAR0 is:", os.environ.get("VAR0")
주문하다:
$ VAR0=abc
$ ./script.py
('VAR0 is:', None) # expected
$ set -a
$ VAR0=abc
$ ./script.py
('VAR0 is:', 'abc') # expected, VAR0 has been exported to the environment and script.py has access to it
$ set +a
$ VAR0=def
$ ./script.py
('VAR0 is:', 'def') # <= unexpected
답변1
당신은 그것이 무엇 set -a
인지 오해했습니다. 변수를 내보내면 변수에 대한 변경 사항이 항상 환경에 반영됩니다. (이것은 의 역사적 구현에서는 항상 사실이 아니었지만 sh
모든 최신 POSIX 호환 쉘에서는 그렇습니다.) 이 -a
옵션은 변수가 이전에 내보내지지 않았더라도 강제로 내보내도록 합니다. 기본적으로 할당은 쉘 변수를 생성합니다. , 그러나 -a
실제로 할당하면 변수가 아직 내보내지지 않은 경우에도 변수가 내보내집니다.
set +a
이 -a
옵션을 설정 해제하세요. 내보낸 변수의 값을 변경하면 환경( -a
유효 여부)에 영향을 미칩니다.
답변2
요점: 예, set +a
설정되어 있지 않지만 set -a
이로 인해 변수가 내보내지지 않습니다. 그런 다음 각 변수를 내보내거나 설정을 해제해야 합니다.
이 옵션 allexport
( 과 동일 set -a
)은 자동 내보내기를 허용합니다.새로운그리고변경됨변하기 쉬운. 이 옵션을 활성화하기 전에 존재했던 변수는 set -a
내보내지지 않습니다.
테스트 전 두 가지 사항:
조건을
set -a
인쇄할 수 있습니다shopt -po allexport
. 그리고는
and를 사용하여 변경할 수 있습니다.shopt -os allexport
shopt -ou allexport
$ shopt -po allexport set +o allexport $ set -a $ shopt -po allexport set -o allexport $ set +a $ shopt -po allexport set +o allexport
쉘이 환경 변수를 테스트하는 방법은 명령의 출력을 확인하고
environment
실제로 확인하는grep
것 입니다.$ env | grep PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Python의 외부 프로그램은 필요하지 않습니다(첫 번째 호출에서 컴파일해야 함). 그것이 당신을 행복하게 만든다면 계속 사용할 수 있지만 실제로는 필요하지 않습니다.
이 옵션을 설정하지 않은 경우( set +a
). ㅏ새로운변수는아니요수출되었습니다.
$ unset VAR0
$ VAR0=abc
$ env | grep VAR0
# nothing is printed.
또는 여전히 프로그램을 원하는 경우:
$ ./envtest.py
VAR0 is: None
옵션을 변경 하면 -a
변경할 때까지 var가 내보내지지 않습니다.
$ set -a
$ shopt -po allexport
set -o allexport
$ env | grep VAR0
$ ./envtest.py
VAR0 is: None
변수가 변경되는 경우:
$ VAR0=bcd
$ env | grep VAR0
VAR0=bcd
$ ./envtest.py
VAR0 is: bcd
set +a
그러나 변수를 적용하면 변수는 환경에 그대로 유지됩니다.
$ set +a
$ env | grep VAR0
VAR0=bcd
$ ./envtest.py
VAR0 is: bcd
var가 변경되더라도 여전히 환경의 일부입니다.
$ VAR0=xyz
$ env | grep VAR0
VAR0=xyz
$ ./envtest.py
VAR0 is: xyz
내보내기가 취소될 때까지(내보내기 속성이 제거됨):
$ declare +x VAR0
아니면 그냥unset
$ env | grep VAR0
VAR0=xyz
$ unset VAR0
$ env | grep VAR0
아니요, null을 할당하는 것은 동일하지 않습니다.
$ VAR0=''
$ env | grep VAR0
VAR0=
귀하의 프로그램은 이것을 명확하게 표시하지 않습니다.
$ ./envtest.py
VAR0 is:
답변3
이는 로컬 쉘 변수에 대한 할당이 이제 환경 변수에 영향을 미치기 때문입니다. 변수를 먼저 설정 해제하면 후속 할당은 이전과 같이 로컬 쉘 변수에만 작용할 수 있습니다.
$ unset VAR0
$ VAR0=def
$ ./script.py
('VAR0 is:', 'None')