Bash의 기능은 하위 프로세스로 실행됩니까?

Bash의 기능은 하위 프로세스로 실행됩니까?

존재하다고급 Bash 스크립팅 가이드, 존재하다예 27-4, 맨 아래에서 7번째 줄을 읽었습니다.

함수는 하위 프로세스로 실행됩니다.

Bash에서 테스트를 했는데 위의 설명이 잘못된 것 같습니다.

이 사이트에서 Bash Man과 내 검색 엔진을 검색해도 단서가 나오지 않았습니다.

답이 있고 설명할 의향이 있나요?

답변1

고급 Bash 스크립팅 가이드는 항상 신뢰할 수 있는 것은 아니며 예제 스크립트에는 다음과 같은 오래된 관행이 포함되어 있습니다.효과적으로 사용되지 않음명령 대체를 위한 백틱(예 `command`: $(command).

이 특별한 경우에는 이는 명백히 잘못된 것입니다.

이 섹션은 다음과 같습니다.쉘 기능(정규) Bash 매뉴얼에 명확하게 명시되어 있습니다.

셸 기능은 현재 셸의 컨텍스트에서 실행되며 이를 해석하기 위한 새 프로세스가 생성되지 않습니다.

답변2

중괄호 함수는 자체 하위 쉘이 필요하지 않는 한 호출 쉘 프로세스에서 실행됩니다. 즉,

  • 백그라운드에서 실행할 때&
  • 파이프라인의 링크로 실행하는 경우

리디렉션 또는 추가 환경. 변수는 새 하위 쉘을 강제로 생성하지 않습니다.

hw(){
    echo hello world from $BASHPID
    echo var=$var
} 
var=42 hw >&2
echo $BASHPID  #unexports var=42 and restores stdout here

중괄호 대신 괄호를 사용하여 함수를 정의하는 경우:

hw()(
  echo hello world from $BASHPID
)
hw 
echo $BASHPID

항상 새로운 프로세스에서 실행됩니다.

또한 명령 대체는 $()항상 bash에서 프로세스를 생성합니다(그러나 내장 명령을 실행하는 경우 ksh에서는 생성되지 않음).

답변3

이 예의 관련 명령은 다음과 같습니다.

echo ${arrayZ[@]/%e/$(replacement)}

후자의 예는 다음을 지적합니다.

#    $( ... ) is command substitution.
#    A function runs as a sub-process.

ABS 가이드에 대한 배려로 그들은 분명히 이 함수를 다음과 같은 형식으로 작성하고 싶었습니다.명령 대체그리고 명령 대체 명령은 다음과 같습니다.서브쉘.

답변4

제가 주목하고 싶은 점은 만약에배경, bash 기능은 서브쉘에서 실행됩니다. 이 사실을 확인하던 중 우연히 이런 질문을 발견했기 때문에 이런 사실을 알게 되었습니다.

[192.168.28.1 (1ae7468c) ~ 19:17:50]# function foo () { echo $BASHPID; }
[192.168.28.1 (1ae7468c) ~ 19:17:59]# foo
807477
[192.168.28.1 (1ae7468c) ~ 19:18:02]# foo
807477
[192.168.28.1 (1ae7468c) ~ 19:18:03]# foo &
[1] 1996783
1996783
[1]+  Done                    foo
[192.168.28.1 (1ae7468c) ~ 19:18:06]# 

관련 정보