환경 변수와 명령 사이에 세미콜론을 사용하는 경우

환경 변수와 명령 사이에 세미콜론을 사용하는 경우

LANGbash에서 업데이트된 것으로 표시되기 위해 세미콜론이 필요한 이유를 설명할 수 있는 사람이 있습니까 ?

작동하지 않습니다:

> LANG=Ja_JP bash -c "echo $LANG"
en_US

공장:

> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP

저는 Linux의 bash 4.1.10과 cygwin의 동일한 버전을 모두 사용하고 있습니다.

답변1

명령을 읽을 때 매개변수 및 기타 유형의 확장이 수행됩니다.~ 전에실행됩니다.

첫 번째 버전인 은 LANG=Ja_JP bash -c "echo $LANG"단일 명령입니다. 그렇게 구문 분석된 후 실행되기 전 $LANG으로 확장됩니다 . 입력 처리가 완료되면 프로세스를 분기하고 en_US예상 대로 환경에 추가한 다음 를 실행합니다 .bashLANG=Ja_JPbash -c echo en_US

작은따옴표(즉, LANG=Ja_JP bash -c 'echo $LANG'outputs) 를 사용하여 확장을 방지할 수 있습니다 Ja_JP.

명령의 일부로 변수 할당이 있는 경우 할당은 해당 명령의 환경에만 영향을 미치고 쉘의 환경에는 영향을 미치지 않습니다.

두 번째 버전은 LANG=Ja_JP; bash -c "echo $LANG"실제로 순서대로 실행되는 두 개의 개별 명령입니다. 첫 번째는 명령 없이 간단한 변수 할당이므로 현재 쉘에 영향을 줍니다.

따라서 단일 ;.

완전히 주제에서 벗어 .UTF-8났지만 LANG. 21세기에 유니코드를 사용하지 않을 이유가 없습니다.

답변2

VAR=value; somecommand는 다음과 같습니다

VAR=value
somecommand

이는 차례로 실행되는 관련 없는 명령입니다. 첫 번째 명령은 쉘 변수에 값을 할당합니다 VAR. 이미 환경 변수가 아닌 이상 VAR환경으로 내보내지지 않고 셸 내부에 남아 있습니다. 명령문은 환경으로 export VAR내보내집니다 .VAR

VAR=value somecommand다른 구문입니다. 할당은 VAR=value환경에 대한 것이지만 이 할당은 somecommand셸의 후속 실행이 아닌 의 실행 환경에서만 이루어집니다.

예를 들어:

# Assume neither VAR1 nor VAR2 is in the environment
VAR1=value
echo $VAR1                        # displays "value"
env | grep '^VAR1='               # displays nothing
VAR2=value env | grep '^VAR2='    # displays "VAR2=value"
echo $VAR2                        # displays nothing

답변3

제가 연구를 통해 수집한 내용을 요약하면 다음과 같습니다.

env 변수와 쉘 변수의 두 가지 유형이 있습니다.

프로그램 및 해당 하위 프로그램/프로세스/하위 쉘에서 환경 변수를 사용할 수 있습니다. 쉘 변수는 현재 쉘에서만 사용할 수 있습니다.

https://askubuntu.com/a/26322/326584

먼저 echo $VAR작동 방식

터미널/쉘/bash는 $ 기호를 볼 때마다 "매개변수 확장"이라는 작업을 수행합니다. 이는 변수가 값으로 대체됨을 의미합니다.

https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

따라서 VAR'hello' 값이 있으면 echo $VAR가 됩니다 echo 'hello'.

이는 이것이 작동한다는 것을 의미합니다 ...

TEST=123 
echo $TEST
// 123

그러나 명령이 변수를 설정할 수 있기 전에 변수가 대체되었기 때문에 다음은 작동하지 않습니다.

TEST2=999 echo $TEST2
// nothing...

하지만 세미콜론을 추가하면..

TEST2=999; echo $TEST2

그것은 같다..

TEST2=999
echo $TEST2

.. 이전과 동일하게 작동합니다.

그리고 쉘 변수는 하위 프로세스/하위 프로세스로 전달되지 않으므로 명령을 호출하면 새 프로세스가 생성되므로...

TEST3=111 
node -e 'console.log(process.env.TEST3)' 

또는

TEST3=111 
printenv TEST3

둘 다 아무것도 인쇄하지 않습니다. 쉘 변수는 chld 프로세스에 의해 상속되지 않습니다. 내보내기를 사용하여 환경 변수인 쉘 변수를 만듭니다.

export TEST3=111 
printenv TEST3
//111

한 가지 예외가 있습니다.

VAR=123 printenv VAR
VAR=123 VAR2=456 printenv VAR2 //even multiple vars

기본적으로 이렇게 작성하고 명령을 호출한 직후에 해당 명령에 대한 환경 변수만 일시적으로 설정됩니다. 쉘 var도 설정하지 않습니다. 완전히 새로운 구문이라고 생각하세요.

VAR=123 printenv VAR // 123
echo $VAR // nothing
VAR=123
echo $VAR // 123

관련 정보