답변:
명령 평가의 여러 단계가 수행되는 순서는 중요합니다.
A=10 echo $A
제 파싱 세 단어로 이루어진 간단한 명령에 대한 명령 A=10
, echo
및 $A
. 그런 다음 각 단어에는 변수 대체가 적용됩니다. 즉 변수 확장을 $A
값 으로 변환하는 것 (표시되지 않는 단계는 생략)입니다.
경우 A
값을 가지고 foo
초기 확장 단계의 결과는 여전히 세 단어를 가지고 간단한 명령은 다음과 같습니다 A=10
, echo
그리고 foo
. 쉘은이 시점에서 처음에 따옴표 안에 있던 문자를 기억합니다 (이 경우에는 없음). 다음 단계는 명령을 실행하는 것입니다. 이후 A=10
등호 따르는 유효한 변수 이름으로 시작되고, 이것은 과제로 처리되고; 변수 A
는 10
명령 실행 중에 쉘과 환경 모두에 설정됩니다 . (일반적으로 당신은 쓸 필요가 export A
가지고 A
단지 쉘 변수와 환경이 아니라, 이것은 예외입니다.) 다음 단어가 할당되지 않습니다, 그것은 명령 이름 (그것의 내장 명령)으로 처리 그래서. 그만큼echo
명령은 변수에 의존하지 않으므로 A=10 echo $A
와 정확히 동일한 효과가 echo $A
있습니다.
명령 기간 동안 만 변수를 설정하지만 명령을 실행하는 동안 할당을 고려하려는 경우 서브 쉘을 사용할 수 있습니다. 괄호로 표시된 서브 쉘은 모든 상태 변경 (변수 지정, 현재 디렉토리, 함수 정의 등)을 서브 쉘에 로컬로 만듭니다.
(A=10; echo $A)
export A=10
외부 프로그램에서 볼 수 있도록 변수를 환경으로 내보내려면 확인하십시오 .
A=10; (echo $A)
출력 10
을 설정 A
합니다.
A=10 eval 'echo $A'
. 작은 따옴표 $A
는 전체 줄이 평가 될 때까지 해석을 중지합니다 . 나는이 대답이 수용 된 것보다 더 옳다고 생각합니다.
$A
및 할당 A
이 발생 하는 순서입니다 . 예를 들어 A=5; A=6 let 'a=A'; echo $a
반환 6
하지 않으며 내장 명령이기 때문에 서브 쉘을 시작 5
하지 않는다고 생각 let
합니다.
A=10 echo $A
것 없는 설정 A=10
이후 모든 명령에 대해 서로 다른 라인 (할당이 때 분명히에있는 경우에도 한 이미 평가). 그것은 주문에 관한 것이 아니라 범위
당신이 사용하는 경우 LANG=C gcc ...
어떤 일이 쉘에 대한 LANG을 설정이다 gcc
의 환경 에서만 , 그리고 하지 에 대한 현재의 환경 자체 ( 참고 참조 ). 따라서 gcc
완료 후 LANG
이전 값으로 돌아갑니다 (또는 설정되지 않음).
또한, 사용 A=10 echo $A
하는 경우 에코가 아닌 $ A를 대체 하는 쉘 이고,이 대체 ( "확장"이라고 함) 는 명령문이 평가 되기 전에 (할당 포함 ) 발생 하므로 예상 A
값 으로 작동 하려면 이미 설정되어 있어야합니다. 그 진술 이전 의 현재 환경 에서 .
그것이 A=10 echo $A
예상대로 작동하지 않는 이유입니다 : A=10
echo에 대해 설정되지만 echo는 환경 변수의 값을 내부적으로 무시합니다 A
. 그리고 현재 쉘에$A
설정된 값 (없음) 으로 바뀐 다음 에코에 대한 인수로 전달됩니다.
당신의 가정이 정확 그래서 : VAR=value command
수행 작업을하지만,이 경우에만 관련이 command
내부적으로 사용하는 VAR를. 그렇지 않으면에 value
대한 인수 로 여전히 전달할 수 command
있지만 인수는 현재 쉘로 대체 되므로 사용 전에 설정해야합니다.VAR=value; command "$VAR"
실행 가능 스크립트를 작성하는 방법을 알고 있으면 다음과 같이 테스트 해보십시오.
#!/bin/sh
echo "1st argument is $1"
echo "A is $A"
다른 이름으로 저장 testscript
하고 시도하십시오.
$ A=5; A=10 testscript "$A"; echo "$A"
1st argument is 5
A is 10
5
마지막으로 쉘 및 환경 변수와 프로그램 인수 의 차이점을 아는 것이 좋습니다.
다음은 좋은 참고 자료입니다.
.
(*) 참고 : 기술적으로 쉘이 않는 일부 명령, 같은 : 왜 여기에 너무 현재의 환경에서 설정하고,이다 echo
, read
하고 test
있는 쉘 내장 명령이 , 그리고 같은 그들은 자식 프로세스를 생성하지 않습니다. 현재 환경에서 실행됩니다. 그러나 셸은 명령이 실행될 때까지만 할당을 처리하므로 모든 실제적인 목적에 따라 효과는 동일합니다. 할당은 단일 명령으로 만 볼 수 있습니다.
$A
. 과제가 수행되기 전에 평가됩니다. 변수의 값에 따라 동작하는 일반 내장 유틸리티의 경우에만 설명이 실패한다고 생각합니다. 내장에는 지정된 값이 표시됩니다. 일반적인 예는 IFS=: read one two three rest
콜론으로 구분 된 필드를 읽는 것 read
입니다 IFS
. 내장은의 값을 봅니다.
echo
대한 값 10
을 볼 수 있습니다 A
.
pid
)은 다른 "regurlar"명령과 같이 할당을 볼 수 없습니다. 그러나 할당 범위를 제한하기 위해 명령이 완료된 후 설정이 해제 됩니다. 이것이 맞습니까? 그에 따라 답변을 수정하겠습니다. PS : 교칙 옆으로, 나는 아직도 다른 사람이 생각할 수있는, 답변이 범위 측면하지 평가 순서에 강조해야한다고 생각 A=10 test; echo $A
(10) 인쇄합니다
A=10 (echo $A)
얻을 수10
있습니까?