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

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

함수는 다음과 같이 실행됩니다. 하위 프로세스입니다.

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

검색 이 사이트, Bash Man, 그리고 내 검색 엔진은 아무런 빛도 가져 오지 않습니다.

답이 있고 설명하고 싶으십니까?

댓글

  • 설명했듯이이 가이드는 극단적으로 오해의 소지가 있습니다. 대신 Wooledge Bash 가이드 를 추천합니다.
  • 중요한 사실은 " Bash "는 서브 쉘 생성을 피합니다. 비용이 많이 들고 자체 환경이 있으며 스크립트의 성능과 코드 흐름 방식에 영향을줍니다 (특성을 처리하기 위해 여러 번 불편 함). Bash의 실제 상태는 코드 진화 인 진화의 산물입니다. 내 말은, Bash의 첫 번째 버전은 실제보다 더 많은 서브 쉘 ***을 사용합니다. 이런 종류의 불일치는 합리적입니다. *** 증명을 원하시면 ' 줄 수 없습니다. 저는 ' 웹 페이지, 댓글에서 파생 시켰습니다 … 저는 ' 언젠가 어딘가에서 그 문장을 읽었습니다.

답변

고급 Bash 스크립팅 가이드는 항상 신뢰할 수있는 것은 아니며 예제 스크립트에는 명령 대체에 대한 백틱을 효과적으로 사용하지 않습니다 . 즉, $(command)가 아닌 `command`입니다.

이 특별한 경우에는 명백히 잘못되었습니다.

(표준) Bash의 셸 함수 섹션 manual은

쉘 기능이 현재 쉘 컨텍스트에서 실행된다는 것을 명확하게 명시합니다. 이를 해석하기위한 새로운 프로세스가 생성되지 않습니다.

댓글

  • " 고급 Bash 스크립팅 가이드는 일반적으로 신뢰할 수 없습니다. " 매우 사실입니다.
  • 첫 번째 문장?
  • @WillVousden 여기서 참조는 어떤 모습일까요? 가이드 '의 기술적 부족한 예가 있습니까? bash 커뮤니티의 전문가가 이전에 신뢰할 수 없다고 언급 한 문서? bash에서 골드 배지를 가진 stackoverflow 회원이 방금 의견에 동의하면 도움이 될까요? : p
  • @WillVousden ' 원하는 것이 신뢰할 수있는 형태로 존재한다고 생각하지 않습니다. Mendel Cooper는 과거에 가이드의 문제를 업데이트하고 수정했지만 공개 버그 추적 기나 정오표 목록이 없습니다. (아마 그것이 제가 할 수있는 가장 끔찍한 진술 일 것입니다.) 따라서 결함 (인식 또는 실제)을 발견하면 저자에게 이메일을 보내고 최선을 다하기를 바랍니다.
  • @WillVousden, .. .Freenode #bash 채널에서 ABS를 피해야한다는 합의가 얼마나 오래되었는지에 대한 기록 을 원한다면 wooledge.org/를 참조하십시오. ~ greybot / meta / abs -각 줄의 두 번째 필드는 타임 스탬프이고 첫 번째 필드는 사용자 이름입니다. ' 문제의 사용자 이름이 매우 존경받는 개인이라는 주장만으로 충분하기를 바랍니다.

답변

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

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

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

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에서는 생성되지 않음). 내부에서 내장 기능을 실행합니다).

댓글

  • 나는 ' f() (...)는 허용됩니다. {...}(...) 외에 다른 정의가 있습니까? Bash에서 I ' 아직 다른 사람과 연결되지 않았습니다.
  • @tomas function hw { echo hello world; } 구문을 사용할 수 있습니다 (() function를 입력하고 마지막 } 또는 ) (hw(){ echo error; } >&2 참조). 그 '에 대한 내용입니다.
  • 바로 제가 생각했던 대답이고, 절대적으로 정확합니다.정답으로 투표해야합니다. f()(...)는 항상 자체 셸을 실행하지만 f(){...}는 실행하지 않습니다.
  • NB bash 함수는 모든 복합 명령을 허용하므로 foo() [[ x = x ]]도 유효한 함수 정의입니다. 그러나 type foo로 함수를 살펴보면 '이 함수가 여전히 . 서브 쉘 함수도 마찬가지입니다. bar() ( : )bar() { ( : ); }가됩니다.
  • @kojiro nice +1. ' 몰랐습니다

답변

이 예제의 질문은 다음과 같습니다.

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

이 예제는 나중에 설명합니다.

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

ABS Guide의 자선 단체이기 때문에 그들이 작성하려는 의도는 함수가 명령 대체 내에서 실행되고 명령 대체 내부의 명령이 서브 셸 에서 실행된다는 것입니다.

댓글

  • ' 매우 오해의 소지가 있습니다. 해석해 주셔서 감사합니다.
  • @tomas " 매우 오해의 소지가 있습니다. " 예, 대단히. ABS 가이드와 달리 Greg '의 Wiki 는 고급 bash 정보의 훌륭한 소스입니다.
  • 건배. 이 항목에 대한 ' 의견은 무엇입니까? wiki.bash-hackers.org/start ?
  • @tomas 나는 그것에 대한 직접적인 지식이 없습니다.
  • @tomas, … bash-hackers wiki에 대한 내 의견은 그것이 '는 훌륭한 소스입니다. ' Wooledge 위키만큼 포괄적으로 처리하지는 않았지만 정확하고 정확하게 작성되는 경향이 있습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다