Bash에서 함수가 하위 프로세스로 실행됩니까?


28

에서 고급 Bash 스크립팅 가이드 에 예 27-4 , 아래에서 7 번째 라인,이 읽었습니다 :

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

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

이 사이트, Bash Man 및 검색 엔진에서 검색하면 아무런 효과가 없습니다.

답이 있고 설명하고 싶습니까?


12
언급했듯이이 가이드는 극단적으로 오도됩니다. 대신 Wooledge Bash Guide 를 권장합니다 .
— 와일드 카드

답변:


36

고급 Bash 스크립팅 가이드는 항상 신뢰할 수 없습니다 그 예 스크립트 등 사용하는 것과 아웃 날짜가 기입 된 사례를 포함 효율적으로 사용되지 않는 , 즉, 명령 치환을 위해 역 따옴표를 `command`대신을 $(command).

이 특별한 경우에는 끔찍하게 잘못되었습니다.

(정식) Bash 매뉴얼의 Shell Functions 에 대한 섹션 은

쉘 함수는 현재 쉘 컨텍스트에서 실행됩니다. 이를 해석하기 위해 새로운 프로세스가 작성되지 않습니다.


10
"고급 Bash 스크립팅 안내서는 일반적으로 신뢰할 수 없습니다" 매우 사실입니다.
— John1024

1
첫 번째 문장을 뒷받침 할만한 참고 자료를 줄 수 있습니까?
— Will Vousden

5
@ WillVousden 여기에 참조가 어떻게 생겼습니까? 가이드의 기술적 부족에 대한 예는? bash 커뮤니티의 전문가가 이전에 신뢰할 수 없다고 언급 한 문서는 무엇입니까? bash에 금색 배지가있는 stackoverflow 멤버가 의견에 동의하면 도움이됩니까? : p
— kojiro

3
@ WillVousden 나는 당신이 원하는 것이 신뢰할 수있는 형태로 존재한다고 생각하지 않습니다. Mendel Cooper는 과거에 가이드와 관련하여 문제를 업데이트하고 수정했지만 공개 버그 추적 기나 정오표 목록은 없습니다. (아마도 그게 내가 할 수있는 가장 끔찍한 말일 것입니다.) 따라서 우리가 결함 (인식되거나 실제적인)을 발견 할 때 우리가 할 수있는 모든 것은 저자에게 이메일을 보내고 최선을 다하기를 희망하는 것입니다.
— kojiro

3
@WillVousden, ... Freenode #bash 채널에서 ABS를 피해야한다는 컨센서스 의 역사 를 원한다면 각 라인의 두 번째 필드 인 wooledge.org/~greybot/meta/abs를 참조하십시오. 타임 스탬프이고 첫 번째는 사용자 이름입니다. 문제의 사용자 이름이 매우 존경받는 개인이라는 주장이 충분하기를 바랍니다.
— Charles Duffy

32

중괄호 함수는 다음과 같은 자체 서브 쉘이 필요하지 않은 한 호출 쉘 프로세스 내에서 실행됩니다.

  • 와 함께 백그라운드에서 실행할 때 &
  • 파이프 라인에서 링크로 실행할 때

리디렉션 또는 추가 환경 변수는 새로운 서브 쉘을 강제하지 않습니다 :

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

curlies 대신 괄호로 함수를 정의하는 경우 :

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

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

명령 대체 $()는 항상 bash에서 프로세스를 작성합니다 (내부에서 내장 명령을 실행하는 경우 ksh가 아님).


나는 몰랐다 f() (...). {...}및 외에 다른 정의가 (...)있습니까? Bash에서는 아직 다른 사람이 아닙니다.
— Tomasz

1
@tomas function hw { echo hello world; } 구문을 사용할 수 있습니다 ( ()타자 입력 할 필요가없고 function결승 직후 }또는 )에서처럼 리디렉션을 지정할 수 있습니다 hw(){ echo error; } >&2.
— PSkocik

2
이것이 바로 내가 생각한 답이며, 절대적으로 맞습니다. 정답으로 투표해야합니다. 그렇지 않으면 f()(...)항상 자체 쉘을 실행하십시오 f(){...}.
— rexkogitans

11
NB bash 함수는 복합 명령을 허용하므로 foo() [[ x = x ]]유효한 함수 정의도 있습니다. 그러나 함수를 살펴보면 type foo이것이 여전히 구문 설탕이라는 것을 알 수 있습니다 foo() { [[ x = x ]]; }. 동일은 서브 쉘 기능의 사실이다 : bar() ( : )이된다 bar() { ( : ); }.
— kojiro

1
@kojiro nice +1. 몰랐어요
— PSkocik

9

이 예제에서 문제가되는 명령은 다음과 같습니다.

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

이 예는 다음과 같습니다.

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

ABS Guide에 자선하기 때문에 분명히 작성해야 할 것은 함수가 명령 대체 내에서 실행되고 명령 대체 내 명령이 하위 쉘 에서 실행된다는 것 입니다.


매우 오해의 소지가 있습니다. 해석해 주셔서 감사합니다.
— Tomasz

5
@tomas "매우 오도합니다." 그렇습니다 ABS 가이드와 달리 Greg 's Wiki 는 고급 bash 정보의 훌륭한 소스입니다.
— John1024

1
건배. 이것에 대한 당신의 의견은 무엇입니까 : wiki.bash-hackers.org/start ?
— Tomasz

@tomas 나는 그 것에 대한 직접적인 지식이 없습니다.
— John1024

2
@tomas, ... bash-hackers Wiki에 대한 내 의견은 훌륭한 출처라는 것입니다. 나는 Wooledge Wiki를 사용하는 것처럼 포괄적으로 진행하지는 않았지만 정확하고 정확하게 작성되는 경향이 있습니다.
— Charles Duffy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.