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.