내 zsh가 왜 이렇게 작동합니까?
% MYVAR="hi" echo $MYVAR
% MYVAR="$(date)" echo $MYVAR
% export MYVAR="$(pwd)"
% echo $MYVAR
/Users/theonlygusti
환경 변수가 같은 줄에 설정되지 않은 이유는 무엇입니까?
답변1
지휘 중
MYVAR="hi" echo $MYVAR
이 변수는 명령 환경에 설정됩니다 MYVAR
. 그러나 명령은 이 변수를 사용하지 않습니다. 현재 쉘은 명령줄에서 인수를 확장합니다.hi
echo
echo
$MYVAR
전화하기 전에echo
.
따라서 MYVAR
변수가 이전에 셸에 존재하지 않으면 명령은 개행만 출력합니다.
마지막 예에서는 echo
명령줄에서 확장을 호출하기 전에 셸에서 변수를 설정했습니다. $MYVAR
이 시점에서 변수가 결과로 설정되므로 $(pwd)
(내보내기가 필요하지 않음) 셸은 $MYVAR
변수를 호출하기 전에 해당 값으로 바꿉니다 echo
.
사이의 차이
variable=value some-command
그리고
variable=value; some-command
또는 이에 상응하는
variable=value
some-command
예, 첫 번째 경우 변수는 현재 셸이 아닌 환경의 값으로 설정되는 some-command
반면, 두 번째/세 번째 경우 변수는 현재 셸에 설정된 다음 some-command
호출됩니다. 다르게 내보낸 경우 변수 를 사용하려는 경우 variable
환경에서도 변수를 사용할 수 있습니다 .some-command
예:
$ unset -v var
다른 명령을 호출하는 동안 변수를 설정하면 명령 환경에 변수가 설정되지만 로컬 환경에는 설정되지 않습니다.
$ var=1 sh -c 'printf "var is %s\n" "$var"'
var is 1
$ printf 'var is %s\n' "$var"
var is
로컬 환경에서 변수를 설정하되 내보내지 말고 로컬로 설정하세요.
$ var=1; sh -c 'printf "var is %s\n" "$var"'
var is
$ printf 'var is %s\n' "$var"
var is 1
하위 프로세스에서 사용할 수 있도록 변수를 내보냅니다.
$ export var
$ sh -c 'printf "var is %s\n" "$var"'
var is 1
알아채다
MYVAR=$(pwd)
동일합니까?
MYVAR=$PWD