답변:
쉘 이 실제로 명령을 실행 하기 전에 명령 행에서 변수를 확장하고 그 때 변수가 존재하지 않기 때문입니다. 당신이 사용하는 경우
TEST=foo; echo $TEST
작동합니다.
export
이후에 실행되는 명령의 환경에 변수가 표시됩니다 (bash에서 작동하는 방식에 대해서는 참조 help export
). 하나의 명령 환경에 변수 만 나타나려면 시도한 것을 사용하십시오.
TEST=foo your-application
$TEST
명령 행이 실행되기 전에 쉘이 확장됩니다 . 일단 echo
실행 되면 ( echo
일반적으로 셸 내장 명령으로 변환되고로 변환되지 않음 /bin/echo
) 환경에서 변수 세트를 확인합니다. 그러나 환경에서 변수의 내용을 출력하도록 지시 echo $TEST
하지 않습니다 . 쉘 은 현재 변수라는 변수에 인수가있는 것으로 실행하도록 지시합니다 .이 두 가지는 매우 다른 것입니다. echo
TEST
echo
TEST
var=value sh -c 'echo "$var"'
않습니까?
sh -c
) 자식 셸에 의해 수행되는 두 가지 구문 분석이 있습니다 .
환경 변수가 아닌 셸 변수가 제한된 범위를 갖기 를 원한다고 생각합니다 . 환경 변수는 실행될 때 명령에 전달 된 문자열 목록입니다 .
에서
var=value echo whatever
var=value
에코가 수신하는 환경으로 문자열을 전달합니다 . 그러나 echo
환경 목록으로 아무 것도하지 않으며 대부분의 쉘에서 echo
내장되어 실행 되지 않습니다 .
당신이 쓴 경우
var=value sh -c 'echo "$var"'
그것은 또 다른 문제 였을 것입니다. 여기서 우리는 명령을 전달 var=value
하고 있으며 환경을 사용합니다. 셸은 환경에서받는 각 변수를 셸 변수 로 변환하므로 수신 되는 환경 변수 는 변수 로 변환 되고 해당 명령 줄 에서 변수가 확장 되면이 됩니다. 환경은 기본적으로 상속되므로 환경 에서도 수신 되지만 (또는 실행 된 경우) 환경에 신경 쓰지 않습니다.sh
sh
var
sh
$var
echo
echo value
echo
var=value
echo
내가 생각하기에 원하는 것은 쉘 변수의 범위를 제한하는 것입니다. 몇 가지 가능한 접근법이 있습니다.
휴대 가능 (Bourne 및 POSIX) :
(var=value; echo "1: $var"); echo "2: $var"
위의 (...)는 하위 쉘 (대부분의 쉘에서 새로운 쉘 프로세스)을 시작하므로 선언 된 모든 변수는 해당 하위 쉘에만 영향을 미치므로 위의 코드는 "1 : value"를 출력 할 것으로 예상됩니다. 및 "2 :"또는 "2 : whatever-var-was-set-to-before".
Bourne과 같은 대부분의 쉘에서 함수와 "로컬"내장 기능을 사용할 수 있습니다.
f() {
local var
var=value
echo "1: $var"
}
f
echo "2: $var"
zsh를 사용하면 인라인 함수를 사용할 수 있습니다.
(){ local var=value; echo "1: $var"; }; echo "2: $var"
또는:
function { local var=value; echo "1: $var"; }; echo "2: $var"
bash 및 zsh (ash, pdksh 또는 AT & T ksh는 아님)를 사용하면이 트릭도 작동합니다.
var=value eval 'echo "1: $var"'; echo "2: $var"
몇 쉘에서 작동하는 변종 ( dash
, mksh
, yash
)하지만 zsh
(투입하지 않는 한 sh
/ ksh
에뮬레이션) :
var=value command eval 'echo "1: $var"'; echo "2: $var"
( POSIX 쉘에서 command
특수 내장 (여기 eval
) 앞에서 사용 하면 특수성이 제거됩니다 (여기서 변수 할당은 반환 된 후에도 유효합니다))
당신은 제대로 일을하고 있지만 bash는 구문이 잘못 해석하기 쉽다 : 당신이 생각할 수있는 echo $TEST
원인 echo
가져 TEST
ENV var에 다음을 인쇄, 그것은하지 않습니다. 그래서 주어진
export TEST=123
그때
TEST=456 echo $TEST
다음 순서를 포함합니다.
쉘은 전체 명령 행을 구문 분석하고 모든 변수 대체를 실행하므로 명령 행은
TEST=456 echo 123
명령 전에 설정 한 임시 vars를 작성하므로 현재 값을 저장하고 TEST
456으로 겹쳐 씁니다. 명령 행은 이제
echo 123
나머지 명령을 실행합니다.이 경우 123을 stdout에 인쇄합니다 (따라서 남아있는 쉘 명령은 임시 값을 사용하지 않았습니다 TEST
).
그것은의 가치를 복원 TEST
변수 대체를 포함하지 않으므로 printenv를 대신 사용하십시오.
>> export TEST=123
>> printenv TEST
123
>> TEST=456 printenv TEST
456
>> printenv TEST && TEST=456 printenv TEST && TEST=789 printenv TEST && printenv TEST
123
456
789
123
>>
printenv
테스트 / 개념 증명에 도움이되는 것으로 나타났습니다 (대신 스크립트와 달리 동작 echo
)
다음을 사용하여이 작업을 수행 할 수 있습니다.
TEST=foo && echo $TEST
TEST=foo
별도의 명령문으로 실행 중 echo
입니다. 의 컨텍스트에서만 설정되지는 않습니다 .