2016-06-30 2 views
2

배경

[ 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의 수정은 여기에 명령 치환 영향을 미쳤는가?

+1

나는 서브 쉘에 상속 된'PATH' *에 대한 변경으로'서브 쉘에서''PATH' *에 대한 변경을 혼란스럽게 생각합니다. – chepner

+0

@chepner : 실제로 PATH가 환경 변수라는 사실을 간과 했으므로 변경 사항을 적용하기 위해 내보낼 필요가 없습니다. – sjsam

+2

아, 그래. 변수를 "내보내기"한다는 것은 실제로 그 이름을 표시하는 것을 의미하므로 해당 이름과 연관된 * 값 *이 모든 하위 프로세스의 환경에 추가된다는 것을 명심하십시오. 환경 변수는 환경에서 초기화 된 변수가 자동으로 내보내집니다. – chepner

답변

4

예 이하 고려해

$ export PS1='\$\$=$$ \$ ' 
$$=30862 $ a=123 # Note: No export a here. 
$$=30862 $ echo $a 
123 
$$=30862 $ bash 
$$=31133 $ echo $a # Subshell explicitly created does not have it. 

$$=31133 $ exit 
$$=30862 $ echo $(eval 'echo $a') # This subshell however does inherit it. The single quote ensures that this is not evaluated by parent shell. 
123        # echo $(echo $a) would probably cause $a to be evaluated by parent shell. 
$$=30862 $ 

즉, 변수가 반출되지 않더라도 상위 쉘로 $(...) 상속 같은 환경 스폰 서브 쉘. (even $$은 부모 쉘과 동일하다.)

+0

완벽한! 문서에서 "부모 쉘과 동일한 환경을 상속하십시오"라고 말씀 해주십시오. – sjsam

+0

^^ 나는 ': - /'을 찾을 수 없었다. 다시 시도 ... – anishsane

+0

probs 없음 .. 시간을내어. – sjsam