Bash에서 서브쉘을 생성하는 방법은 무엇입니까?

Bash에서 서브쉘을 생성하는 방법은 무엇입니까?

지금까지 제가 아는 방법은 주로 2가지입니다.

  • 분명히: 명령 목록을 괄호로 묶습니다.

  • 암묵적으로: 파이프라인의 각 명령

Bash에서 서브쉘을 생성하는 더 많은 방법(명시적 또는 암시적)이 있습니까?

답변1

에서 man bash:

  • 명령이 제어 연산자에 의해 종료되면 &쉘은 서브쉘의 백그라운드에서 명령을 실행합니다. 쉘은 명령이 완료될 때까지 기다리지 않고 상태 0을 반환합니다.
  • 코프로세스는 예약어 앞에 오는 쉘 명령입니다 coproc.
    Coprocess는 마치 & 제어 연산자를 사용하여 명령이 종료된 것처럼 서브셸에서 비동기식으로 실행됩니다.
  • 쉘 내장 complete명령: -C command 옵션과 함께 호출 되면 command서브쉘 환경에서 실행되며 그 출력은 가능한 완성으로 사용됩니다.
  • 명령 대체, 괄호로 그룹화된 명령 및 비동기 명령은 쉘 환경과 복제된 서브쉘 환경에서 호출됩니다.

답변2

"서브쉘"의 의미에 따라 다릅니다. "파이프라인의 모든 명령" 글머리 기호 항목의 요점을 놓쳤을 수 있습니다. 

당신이 달릴 때마다어느(외부) 프로그램(예: 쉘 내장이 아닌 스크립트 또는 바이너리 실행 파일)을 사용하지 않는 한 하위 프로세스에서 실행하게 됩니다. 쉘은 프로그램을 분기하고 실행합니다. 작업 자체와 마찬가지로 하위 쉘이 생성되지 않습니다.exec programls | wclswc

흥미롭게도 이를 파이프라인에 포함하면 다음과 같은 결과가 발생할 수 있습니다.내장 쉘서브쉘에서 실행. 다음 예를 고려하십시오.

$ v 읽기
고양이                                     # 사용자가 입력한 내용입니다.

$echo "$v"
고양이

$ 에코 쿠거 읽기 |

$echo "$v"
고양이

두 번째 명령은 파이프라인의 일부 read v이므로 하위 셸에서 실행됩니다 . echo cougar | read v따라서 값이 cougar손실되고 $v원래 값을 유지합니다.

마찬가지로, 이와 같은 명령은

$ echo foo | cd /

$ cd / | cat

$ echo foo | exit

$ exit | cat

메인 쉘에는 영향을 미치지 않습니다.

관련 정보