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


14

LANGbash가 업데이트 된 것으로 보이기 위해 세미콜론이 필요한 이유를 누구나 설명 할 수 있습니까 ?

작동하지 않습니다 :

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

공장:

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

리눅스에서 bash 4.1.10과 cygwin에서 동일한 버전으로 작업하고 있습니다.

답변:


23

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

첫 번째 버전 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 세기에 유니 코드를 사용하지 않는 좋은 이유는 없습니다.


좋은 답변-감사합니다! UTF-8 추가와 관련하여. 몇 가지 플랫폼에서 작동 해야하는 응용 프로그램의 로캘 처리를 테스트하려고합니다. 이와 같은 차이점 (고맙게 설명했습니다)과 리눅스와 cygwin의 차이점 사이에 버스를 타려고합니다!
Richard Corden

5

VAR=value; somecommand 에 해당

VAR=value
somecommand

이들은 서로 관련이없는 명령입니다. 첫 번째 명령은 쉘 변수에 값을 할당합니다 VAR. 하지 않는 한 VAR이미이 환경에 수출되지 않는 환경 변수, 그것은 쉘 내부에 남아있다. 명령문 export VARVAR환경으로 내보내 집니다.

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

쉘과 환경 변수의 차이점에 대해서는 실제로 생각하지 못했습니다. 나는 약간의 연구를해야 할 것이다. 답변 해주셔서 감사합니다.
Richard Corden
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.