set +a는 -a 플래그를 설정 해제하지 않습니다.

set +a는 -a 플래그를 설정 해제하지 않습니다.

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내보내지지 않습니다.

테스트 전 두 가지 사항:

  1. 조건을 set -a인쇄할 수 있습니다 shopt -po allexport. 그리고는
    and를 사용하여 변경할 수 있습니다.shopt -os allexportshopt -ou allexport

    $ shopt -po allexport
    set +o allexport
    
    $ set -a
    $ shopt -po allexport
    set -o allexport
    
    $ set +a
    $ shopt -po allexport
    set +o allexport
    
  2. 쉘이 환경 변수를 테스트하는 방법은 명령의 출력을 확인하고 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')

관련 정보