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

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

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'확장을 방지하기 위해 작은따옴표(예: 출력)를 사용할 수 있습니다 Ja_JP.

명령의 일부로 변수를 할당하면 할당은 셸 환경이 아닌 명령 환경에만 영향을 미칩니다.

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

따라서 단일 ;.

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

답변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

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

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

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

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

관련 정보