명령 행에서 환경 변수를 설정하고 명령에 표시하려면 어떻게합니까? TEST=foo echo $TEST foo를 출력합니다. 내가

내가 달리면

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하고 있으며 환경을 사용합니다. 셸은 환경에서받는 각 변수를 셸 변수 로 변환하므로 수신 되는 환경 변수 는 변수 로 변환 되고 해당 명령 줄 에서 변수가 확장 되면이 됩니다. 환경은 기본적으로 상속되므로 환경 에서도 수신 되지만 (또는 실행 된 경우) 환경에 신경 쓰지 않습니다.shshvarsh$varechoecho valueechovar=valueecho

내가 생각하기에 원하는 것은 쉘 변수의 범위를 제한하는 것입니다. 몇 가지 가능한 접근법이 있습니다.

휴대 가능 (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가져 TESTENV var에 다음을 인쇄, 그것은하지 않습니다. 그래서 주어진

export TEST=123

그때

TEST=456 echo $TEST

다음 순서를 포함합니다.

  1. 쉘은 전체 명령 행을 구문 분석하고 모든 변수 대체를 실행하므로 명령 행은

    TEST=456 echo 123
  2. 명령 전에 설정 한 임시 vars를 작성하므로 현재 값을 저장하고 TEST456으로 겹쳐 씁니다. 명령 행은 이제

    echo 123
  3. 나머지 명령을 실행합니다.이 경우 123을 stdout에 인쇄합니다 (따라서 남아있는 쉘 명령은 임시 값을 사용하지 않았습니다 TEST).

  4. 그것은의 가치를 복원 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