쉘 변수를 내보낼 지 여부를 어떻게 결정합니까? 변수가 환경

Bourne 쉘 제품군에서 쉘 변수는 모두 대문자입니다. 즉, 특정 변수가 환경 변수인지 여부 만 알 수는 없습니다. 어떤 Bourne 쉘 변수가 로컬인지 어떻게 결정합니까 (현재 쉘 내에서만 정의)?



답변

변수가 내보내 졌는지 여부를 확인하려면 declare다음을 사용하십시오 .

$ foo=a bar=b
$ export foo
$ declare -p foo bar
declare -x foo="a"
declare -- bar="b"

답변

가장 휴대하기 쉬운 방법은 export -p입니다.

export -p내 보낸 변수를 나열합니다. 이것은 보통처럼 declare -x, 경우에 쉘이있다 declare.

현재 사용중인 Bourne 스타일 쉘 export -pPOSIX에 필요한 대로를 지원해야합니다 .

-p가 지정, 수출은 표준 출력에 다음과 같은 형식으로 내 보낸 모든 변수의 이름과 값을 작성한다

"export %s=%s\n", <name>, <value>

이름 이 설정된 경우 :

"export %s\n", <name>

이름 이 설정되지 않은 경우

표준 은 변수의 값이 일반적으로 =과제 의 오른쪽에서 나중에 사용할 수 있도록 표시되는 방법을 설명 합니다. 이것은 인용 될 수 있음을 말하는 것입니다. 다른 쉘은 다르게 표시 할 수 있지만 동일한 효과가 있습니다. Dash 와 같이 내장 export -p되어 있지 않은 쉘에서도 작동합니다 .declare

$ dash -c 'export -p | grep HOME='  # busybox sh and other ash give the same output.
export HOME='/home/ek'
$ posh -c 'export -p | grep HOME='  # ksh93, mksh, lksh, and others give the same output.
export HOME=/home/ek

grep압축 을 위해 출력을 파이프 했지만 필터링하지 않으면 내 보낸 변수의 전체 목록이 표시됩니다. 귀하의 질문에서, 그것이 가장 유용하다고 생각되는 것 같습니다.

Bash와 같은 일부 쉘은 POSIX 호환 방식으로 동작하도록 명시 적으로 지시되지 않는 한 비표준 형식을 사용합니다. In Bash export -pdeclare -x기본적으로 동일한 출력을 제공합니다 .

$ bash -c 'export -p | grep HOME='
declare -x HOME="/home/ek"
$ bash -c 'POSIXLY_CORRECT= export -p | grep HOME='
export HOME="/home/ek"
$ bash -c 'set -o posix; export -p | grep HOME='
export HOME="/home/ek"
$ bash --posix -c 'export -p | grep HOME='
export HOME="/home/ek"
$ ln -s /bin/bash sh
$ ./sh -c 'export -p | grep HOME='  # Invoking bash as sh also puts it in POSIX mode.
export HOME="/home/ek"

POSIX 호환성이 활성화 된 경우에도 Zsh는 비표준 형식을 보여줍니다.

$ zsh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
$ zsh -c 'emulate -R sh; export -p | grep HOME='
typeset -x HOME=/home/ek
$ ln -s /bin/zsh sh
$ ./sh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek

어쨌든 뒤에 단어를 검색하여 이식 가능한 표현 (인용 될 수 있음)을 추출 할 수 있습니다 =. 이 단어는 바로 앞에 있지 않는 한 줄의 이전 단어에 의존하지 =않습니다. 예를 들면 다음과 같습니다.

% export -p | grep -oE '\w+=.*'
HOME=/home/ek
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
....

모든 항목에 반드시이있는 것은 아닙니다= . 변수를 설정하지 않고 내보낼 수 있기 때문입니다. 이러한 항목은 grep위 의 명령 으로 필터링되며 원하는 항목 일 수도 있고 아닐 수도 있습니다.

대부분의 시간, 당신은 단지 출력을 검사하고 싶은 항목이 선행하는 경우 그래서 당신은 상관하지 않습니다 export, declare -x, typeset -x다른, 또는 뭔가. 그런 다음 실행하십시오 export -p.

우분투 16.04 LTS에서 공식적으로 패키지 된 각 쉘 버전 으로 해당 명령을 테스트했습니다 .


답변

내 보내지 않은 변수 declare는 bash 의 명령 출력에서 볼 수 있습니다 .

변수 되는 수출은 출력에서 볼 수 declare -x또는 exportbash는 명령.