답변:
매개 변수 및 기타 유형의 확장은 명령을 읽을 때 실행 되기 전에 수행됩니다.
첫 번째 버전 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 세기에 유니 코드를 사용하지 않는 좋은 이유는 없습니다.
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