$()는 서브쉘인가요?

$()는 서브쉘인가요?

서브셸 구문 은 변수 값을 검색할 수 있는 서브셸일 뿐이 (<commands...>)라는 것을 이해합니다 .$()

참고: 이는 문서의 다른 표현에 따라 bash 4.4에 적용됩니다.

답변1

$(…)정의에 따르면 이는 하위 쉘입니다. 이는 쉘 런타임 상태의 복사본이며 하위 쉘의 상태 변경은 상위 쉘에 영향을 주지 않습니다. 서브쉘은 일반적으로 다음과 같은 방법으로 구현됩니다.분기새로운 프로세스(그러나 일부 쉘은 특정 상황에서 이를 최적화할 수 있음)

변수 값을 검색할 수 있는 하위 쉘이 아닙니다. 변수 변경이 상위에 영향을 미치는 경우 하위 쉘이 아닙니다. 이것은 서브 쉘입니다.산출부모님이 검색하실 수 있습니다. 생성된 하위 쉘에는 $(…)상위 쉘이 출력을 읽고 수집하는 파이프로 설정된 표준 출력이 있습니다.

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

  • 서브쉘은그룹: ( … )서브쉘을 생성하고 종료될 때까지 기다리는 것 외에는 아무 작업도 수행하지 않습니다. 이는 { … }그룹 명령이 구문 목적으로만 사용되며 하위 쉘을 생성하지 않는 것과 대조 됩니다.
  • 배경: … &서브쉘을 생성하고 종료될 때까지 기다리지 않습니다.
  • 관로: … | …왼쪽과 오른쪽에 하나씩 두 개의 하위 쉘을 만들고 두 하위 쉘이 모두 종료될 때까지 기다립니다. 쉘은 파이프를 생성하고 왼쪽의 표준 출력을 파이프의 쓰기 끝으로 연결하고 오른쪽의 표준 입력을 읽기 끝으로 연결합니다. 일부 쉘(ksh88, ksh93, zsh, bash 및lastpipe옵션설정되고 유효함) 오른쪽은 원래 셸에서 실행되므로 파이프라인 구성은 하위 셸만 생성합니다.
  • 명령 대체: $(…)(철자라고도 함 `…`)은 표준 출력이 파이프로 설정된 하위 쉘을 생성하여 상위 출력을 수집하고 후행 개행 문자를 제외한 해당 출력으로 확장합니다. (분할 및 와일드카드로 인해 출력이 추가로 영향을 받을 수 있지만 이는 또 다른 이야기입니다.)
  • 프로세스 대체: <(…)표준 출력이 파이프로 설정되고 파이프 이름으로 확장된 하위 쉘을 생성합니다. 상위 프로세스(또는 다른 프로세스)는 파이프를 열어 하위 셸과 통신할 수 있습니다. >(…)동일한 작업을 수행하지만 표준 입력에서 파이프를 사용합니다.
  • 협업 처리: coproc …서브쉘을 생성하고 종료될 때까지 기다리지 않습니다. 서브쉘의 표준 입력 및 출력은 각각 파이프로 설정되며, 상위 쉘은 각 파이프의 다른 쪽 끝에 연결됩니다.

^ 별도의 쉘을 실행하는 것과는 달리.

답변2

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

commandBash는 서브셸 환경에서 실행하여 확장을 수행합니다. [...]

답변3

예, 다른 프로세스에서 실행될 서브 ( commands... )셸 입니다.bashcommands...

유일한 차이점 $( commands... )은 코드의 이 부분이 실행 후에 작성된다는 것입니다 commands....commands...stdout

관련 정보