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

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

지금까지 내가 아는 두 가지 주요 방법이 있습니다.

  • 명시적으로: 명령 목록을 괄호로 묶습니다.

  • 암시적으로: 파이프라인의 모든 명령

bash에서 하위 쉘을 생성하는 명시적 또는 암시적 방법이 더 있습니까?

답변1

에서 man bash:

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

답변2

"하위 쉘"이 무엇을 의미하는지에 따라 다릅니다. 그리고 "파이프라인의 모든 명령" 글머리 기호에서 요점을 놓쳤을 수도 있습니다. 

언제든지 달려가세요어느(외부) 프로그램(즉, 쉘 내장과 달리 스크립트 또는 바이너리 실행 파일)을 사용하지 않는 한 하위 프로세스에서 실행합니다. 쉘은 프로그램을 분기하고 실행합니다.  단독 으로 수행하는 것 이상으로 서브쉘을 생성하지 않습니다 .exec programls | wclswc

흥미로운 점은 이를 파이프라인에 포함하면쉘 내장서브쉘에서 실행하기. 다음 예를 고려하십시오.

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

$ 에코 "$v"
고양이

$ 에코 쿠거 | v를 읽어라

$ 에코 "$v"
고양이

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

마찬가지로 다음과 같은 명령은

$ echo foo | cd /

$ cd / | cat

$ echo foo | exit

$ exit | cat

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

관련 정보