$ ()가 서브 쉘입니까? 쉘 구문을

나는 될 수있는 서브 쉘 구문을 이해하는 (<commands...>)것입니다, $()당신은에서 변수 값을 검색 할 수있는 서브 쉘은?

참고 : 이것은 설명서의 다른 표현을 기반으로 bash 4.4에 적용됩니다.



답변

$(…)정의에 따른 서브 쉘 : 쉘 런타임 상태 ¹의 사본이며 서브 쉘에서 작성된 상태의 변경 사항은 상위에 영향을 미치지 않습니다. 서브 쉘은 일반적으로 새로운 프로세스 를 분기 하여 구현 되지만 일부 쉘은이를 최적화 할 수 있습니다.

변수 값을 검색 할 수있는 서브 쉘이 아닙니다. 변수에 대한 변경 사항이 부모에게 영향을 주면 하위 셸이 아닙니다. 부모 가 출력 을 검색 할 수 있는 서브 쉘입니다 . 로 작성된 서브 쉘 $(…)에는 표준 출력이 파이프로 설정되어 있으며, 상위 파이프는 해당 파이프에서 읽고 출력을 수집합니다.

서브 쉘을 작성하는 몇 가지 다른 구성이 있습니다. 나는 이것이 bash의 전체 목록이라고 생각한다.

  • 그룹화를 위한 서브 쉘 : 서브 쉘을 ( … )생성하고 종료 될 때까지 기다립니다. { … }구문 목적을 위해 순전히 명령을 그룹화하고 서브 쉘을 작성하지 않는 것과 대조하십시오 .
  • 배경 : … &서브 쉘을 작성하고 종료되기를 기다리지 않습니다.
  • 파이프 라인 : … | …왼쪽과 오른쪽에 각각 하나씩 두 개의 서브 쉘을 작성하고 둘 다 종료 될 때까지 기다립니다. 쉘은 파이프를 작성하고 왼쪽의 표준 출력을 파이프의 쓰기 끝에 연결하고 오른쪽의 표준 입력을 읽기 끝에 연결합니다. 일부 쉘 (ksh88, ksh93, zsh, lastpipe옵션이 설정되고 효과적인 bash )에서는 오른쪽이 원래 쉘에서 실행되므로 파이프 라인 구성은 하나의 서브 쉘 만 작성합니다.
  • 명령 대체 : $(…)(또한 철자법 `…`)는 표준 출력을 파이프로 설정하여 서브 쉘을 작성하고, 상위에서 출력을 수집 한 후 마지막 줄 바꿈을 빼고 해당 출력으로 확장합니다. (그리고 결과물은 더 쪼개지고 글 로빙 될 수 있지만, 그것은 또 다른 이야기입니다.)
  • 프로세스 대체 : <(…)표준 출력이 파이프로 설정된 서브 쉘을 작성하고 파이프 이름으로 확장합니다. 부모 (또는 다른 프로세스)는 파이프를 열어 서브 쉘과 통신 할 수 있습니다. >(…)표준 입력의 파이프와 동일하지만 파이프를 사용합니다.
  • Coprocess : coproc …서브 쉘을 작성하고 종료 될 때까지 기다리지 않습니다. 서브 쉘의 표준 입력 및 출력은 각각 파이프로 설정되며 부모는 각 파이프의 다른 쪽 끝에 연결됩니다.

¹ 별도의 셸을 실행하는 것과 달리 .


답변

bash 버전 4.4의 bash (1) 매뉴얼 페이지, “EXPANSION”섹션, “명령 대체”하위 섹션에서 :

Bash command는 서브 쉘 환경에서 실행하여 확장을 수행한다 …]


답변

예, ( commands... )A는 bash실행됩니다 서브 쉘 commands...다른 프로세스에.

당신이 가진 유일한 차이점은 $( commands... )이 코드 부분의 실행 후 것입니다 commands...모든 것을 교체 commands...에 썼다 stdout.


답변