지금까지 제가 아는 방법은 주로 2가지입니다.
분명히: 명령 목록을 괄호로 묶습니다.
암묵적으로: 파이프라인의 각 명령
Bash에서 서브쉘을 생성하는 더 많은 방법(명시적 또는 암시적)이 있습니까?
답변1
에서 man bash
:
- 명령이 제어 연산자에 의해 종료되면
&
쉘은 서브쉘의 백그라운드에서 명령을 실행합니다. 쉘은 명령이 완료될 때까지 기다리지 않고 상태 0을 반환합니다. - 코프로세스는 예약어 앞에 오는 쉘 명령입니다
coproc
.
Coprocess는 마치 & 제어 연산자를 사용하여 명령이 종료된 것처럼 서브셸에서 비동기식으로 실행됩니다. - 쉘 내장
complete
명령:-C command
옵션과 함께 호출 되면command
서브쉘 환경에서 실행되며 그 출력은 가능한 완성으로 사용됩니다. - 명령 대체, 괄호로 그룹화된 명령 및 비동기 명령은 쉘 환경과 복제된 서브쉘 환경에서 호출됩니다.
답변2
"서브쉘"의 의미에 따라 다릅니다. "파이프라인의 모든 명령" 글머리 기호 항목의 요점을 놓쳤을 수 있습니다.
당신이 달릴 때마다어느(외부) 프로그램(예: 쉘 내장이 아닌 스크립트 또는 바이너리 실행 파일)을 사용하지 않는 한 하위 프로세스에서 실행하게 됩니다. 쉘은 프로그램을 분기하고 실행합니다. 작업 자체와 마찬가지로 하위 쉘이 생성되지 않습니다.exec program
ls | wc
ls
wc
흥미롭게도 이를 파이프라인에 포함하면 다음과 같은 결과가 발생할 수 있습니다.내장 쉘서브쉘에서 실행. 다음 예를 고려하십시오.
$ v 읽기 고양이 # 사용자가 입력한 내용입니다. $echo "$v" 고양이 $ 에코 쿠거 읽기 | $echo "$v" 고양이
두 번째 명령은 파이프라인의 일부 read v
이므로 하위 셸에서 실행됩니다 . echo cougar | read v
따라서 값이 cougar
손실되고 $v
원래 값을 유지합니다.
마찬가지로, 이와 같은 명령은
$ echo foo | cd /
$ cd / | cat
$ echo foo | exit
$ exit | cat
메인 쉘에는 영향을 미치지 않습니다.