재검토 된 문제
솔직히, 매뉴얼은이 점에서 혼란 스럽습니다. GNU 배쉬 설명서는 말한다 :
간단한 명령 또는 함수 [내장을 제외 함]에 대한 환경은 쉘 매개 변수에 설명 된대로 매개 변수 지정을 접 두부로 추가하여 일시적으로 보강 할 수 있습니다. 이러한 할당 명령문은 해당 명령이 표시하는 환경에만 영향을줍니다.
실제로 문장을 구문 분석하면 명령 / 함수에 대한 환경 은 수정되지만 상위 프로세스의 환경은 수정되지 않습니다. 따라서 이것은 작동합니다.
$ TESTVAR=bbb env | fgrep TESTVAR
TESTVAR=bbb
env 명령이 실행되기 전에 환경이 수정 되었기 때문입니다. 그러나 이것은 작동하지 않습니다.
$ set -x; TESTVAR=bbb echo aaa $TESTVAR ccc
+ TESTVAR=bbb
+ echo aaa ccc
aaa ccc
매개 변수 확장이 쉘에 의해 수행 될 때 때문입니다.
통역사 단계
문제의 또 다른 부분은 Bash 가 인터프리터에 대해 다음 단계 를 정의 한다는 것입니다 .
- 파일 (쉘 스크립트 참조), -c 호출 옵션에 인수로 제공된 문자열 (Bash 호출 참조) 또는 사용자 터미널에서 입력을 읽습니다.
- Quoting에 설명 된 인용 규칙에 따라 입력을 단어와 연산자로 나눕니다. 이러한 토큰은 메타 문자로 구분됩니다. 별칭 확장은이 단계에서 수행됩니다 (별칭 참조).
- 토큰을 단순 및 복합 명령으로 구문 분석합니다 (셸 명령 참조).
- 다양한 셸 확장 (셸 확장 참조)을 수행하여 확장 된 토큰을 파일 이름 목록 (파일 이름 확장 참조)과 명령 및 인수로 나눕니다.
- 필요한 리디렉션을 수행하고 (리디렉션 참조) 리디렉션 연산자와 해당 피연산자를 인수 목록에서 제거합니다.
- 명령을 실행합니다 (명령 실행 참조).
- 선택적으로 명령이 완료 될 때까지 대기하고 종료 상태를 수집합니다 (종료 상태 참조).
여기서 일어나는 일은 내장 기능이 자체 실행 환경을 얻지 못하므로 수정 된 환경을 볼 수 없다는 것입니다. 또한 간단한 명령 (예 : / bin / echo) 은 수정 된 환경 (env 예제가 작동 한 이유)을 얻지 만 쉘 확장은 4 단계 의 현재 환경에서 발생합니다.
즉, 'aaa $ TESTVAR ccc'를 / bin / echo에 전달하지 않습니다. 보간 된 문자열 (현재 환경에서 확장 됨)을 / bin / echo에 전달합니다. 이 경우 현재 환경에 TESTVAR 이 없으므로 단순히 'aaa ccc'를 명령에 전달합니다.
요약
문서는 훨씬 더 명확 할 수 있습니다. 스택 오버플로가 있습니다!
또한보십시오
http://www.gnu.org/software/bash/manual/bashref.html#Command-Execution-Environment