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'
확장을 방지하기 위해 작은따옴표(예: 출력)를 사용할 수 있습니다 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
제가 연구를 통해 수집한 정보를 요약하면 다음과 같습니다.
환경 변수와 쉘 변수의 두 가지 유형이 있습니다.
환경 변수는 프로그램 및 해당 하위 프로그램/프로세스/하위 쉘 내에서 사용할 수 있습니다. 쉘 변수는 현재 쉘에서만 사용할 수 있습니다.
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