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