ㅏ.{ echo "Hello World"; } >outputfile
비.( echo "Hello World" ) >outputfile
씨../anothershell.sh
디./bin/echo "Hello World"
어느 것이 맞나요? 그리고 현재 쉘의 동일한 프로세스에서는 어떤 종류의 명령을 실행할 수 있습니까?
답변1
현재 쉘 프로세스 내에서는 A만 실행됩니다.
paranehtese를 사용하여 하위 쉘을 요청했기 때문에 B는 하위 쉘에서 실행됩니다.
C와 D는 모두 외부 명령에 대한 호출이므로 현재 쉘 프로세스 외부에서 실행됩니다.
답변2
당신은 이것을 어떻게 증명할 수 있는지 여러 번 물었습니다. 환경 변수 설정을 프로브로 사용합니다.
export testvar=nope
{ echo "Hello World"; export testvar=yep; } >outputfile
printenv testvar
쓰다yep
export testvar=nope
( echo "Hello World"; export testvar=yep; ) >outputfile
printenv testvar
쓰다nope
(C)의 스크립트를 편집하고 (D)에 대해 수정된 에코를 컴파일해야 하지만 그러면 해당 구성도 작성됩니다 nope
.글렌잭맨 사례 댓글(E)동일한 프로세스에서 실행합니다.
답변3
여러분이 놓칠 수 있는 한 가지 차이점은 B가 분기할 것이지만(따라서 다른 프로세스임) 실제로 실행되지는 않는다는 것입니다(동일한 셸의 복사본이므로 /bin/sh를 찾지 않고 init 프로그램 ETC를 다시 실행하지 않습니다). . 그리고 특별한 규칙이 있습니다(예를 들어 $$는 원래 쉘의 pid입니다).