배경
이 [ article ]는 말한다 :
명령 치환이 명령의 출력을 확장합니다. 이 명령은 서브 쉘 실행됩니다 ..
그러나 배쉬 설명서는 명령 치환 섹션에서 subshell
에 대해 아무것도 말하지 않는다.
$ ps
PID TTY TIME CMD
26483 pts/25 00:00:00 bash
26866 pts/25 00:00:00 ps
$ hpid="$(ps | grep bash)"
$ echo "$hpid"
26483 pts/25 00:00:00 bash
26899 pts/25 00:00:00 bash
아래
내 테스트는 PID 26899로 새로운 쉘이 명령 치환 동안 양산 된 것을 알 수있다. 이 시점에서 나는 PATH
환경 변수를 변경했다.
$ PATH="/some/rogue/path"
는 아래의 물건을했다 :
VAR="$(echo "Do|Die" | cut -d"|" -f 2)"
를하고 아래의 오류가있어 : 나는 오류로 인해 쉘을하는 데 도움이 PATH 환경 변수의 수정에 것을 이해
Command 'cut' is available in '/usr/bin/cut'
The command could not be located because '/usr/bin' is not included in the PATH environment variable.
cut: command not found
을 바이너리를 찾습니다. 그러나 나는 이것을 명령어 치환과 함께 읽을 때 혼란 스럽다.
$(..)
하여 하부 쉘이 만들어지는 경우, PATH 환경 변수는 본래 있어야하며 (이 경우 cut
) 이진 가리켜 야 등 배시는 cut
바이너리를 찾을 수 없다는 것을 불평한다.
질문
어떻게 PATH
의 수정은 여기에 명령 치환 영향을 미쳤는가?
나는 서브 쉘에 상속 된'PATH' *에 대한 변경으로'서브 쉘에서''PATH' *에 대한 변경을 혼란스럽게 생각합니다. – chepner
@chepner : 실제로 PATH가 환경 변수라는 사실을 간과 했으므로 변경 사항을 적용하기 위해 내보낼 필요가 없습니다. – sjsam
아, 그래. 변수를 "내보내기"한다는 것은 실제로 그 이름을 표시하는 것을 의미하므로 해당 이름과 연관된 * 값 *이 모든 하위 프로세스의 환경에 추가된다는 것을 명심하십시오. 환경 변수는 환경에서 초기화 된 변수가 자동으로 내보내집니다. – chepner