내가 달리면
export TEST=foo
echo $TEST
foo를 출력합니다.
내가 달리면
TEST=foo echo $TEST
그렇지 않습니다. 내보내기 또는 스크립트를 사용하지 않고 어떻게이 기능을 사용할 수 있습니까?
답변
쉘 이 실제로 명령을 실행 하기 전에 명령 행에서 변수를 확장하고 그 때 변수가 존재하지 않기 때문입니다. 당신이 사용하는 경우
TEST=foo; echo $TEST
작동합니다.
export
이후에 실행되는 명령의 환경에 변수가 표시됩니다 (bash에서 작동하는 방식에 대해서는 참조 help export
). 하나의 명령 환경에 변수 만 나타나려면 시도한 것을 사용하십시오.
TEST=foo your-application
답변
환경 변수가 아닌 셸 변수가 제한된 범위를 갖기 를 원한다고 생각합니다 . 환경 변수는 실행될 때 명령에 전달 된 문자열 목록입니다 .
에서
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
>>
답변
다음을 사용하여이 작업을 수행 할 수 있습니다.
TEST=foo && echo $TEST