
LANG
bash에서 업데이트된 것으로 표시되기 위해 세미콜론이 필요한 이유를 설명할 수 있는 사람이 있습니까 ?
작동하지 않습니다:
> 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
예상 대로 환경에 추가한 다음 를 실행합니다 .bash
LANG=Ja_JP
bash -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