스크립트 함수 호출: 함수 대 $(function)

스크립트 함수 호출: 함수 대 $(function)

단순화를 위해 다음 코드를 참조하는 방법

#!/bin/bash

number=7

function doSomething() {
  number=8
}

doSomething
echo "$number"

.8

하지만 함께:

#!/bin/bash

number=7

function doSomething() {
  number=8
}

$(doSomething)
echo "$number"

.7

다음과 같은 질문이 있습니다.

  • 무엇입니까?기술적인 이름각각에 대해?, 내 말은 functioncall그리고$(functioncall)
  • 각 접근 방식은 어떻게 작동하나요? 전자는 함수 자체 외부의 변수를 고려(영향을 미치는) 것으로 보이지만 후자는 그렇지 않습니다.
  • 한 가지 접근 방식을 다른 접근 방식보다 의무적으로 사용해야 하는 경우(주로 성능 문제에 관한 것입니다. 물론 있는 경우), 다른 이유가 있는 경우 환영합니다.

답변1

당신은 명령 대체의 미묘함을 경험하고 있습니다.

호출

doSomething

간단한 함수 호출입니다. 마치 함수의 명령을 호출한 위치에 복사하여 붙여넣은 것처럼 함수를 실행합니다. 따라서 변수를 number새 값으로 덮어씁니다 8.

호출

$(doSomething)

다른 한편으로는명령 대체. 기능을 실행하는 것을 의미하며,인쇄된 함수가 무엇이든 반환합니다. stdout. 일반적으로 "독립형"으로 사용되지 않지만 변수 할당에서는 사용됩니다.

os_type=$(uname)

uname그러면 Linux 시스템에서 Linux콘솔에 인쇄되는 명령이 실행되고 그 결과가 쉘 변수에 저장됩니다 os_type. 따라서 doSomething. 실제로 대체는 $(doSomething)기본적으로 출력에 대한 자리 표시자 이므로 doSomething스크립트 오류가 발생하지 않는 유일한 이유는 함수가 아무 것도 출력하지 않기 때문입니다. 예를 들어 다음과 같이 말했습니까?

$(uname)

대신에

$(doSomething)

귀하의 쉘은 명령을 실행하려고 시도 Linux하고

Linux: No such file or directory

오류 (1) .

관찰한 효과를 이해하는 핵심 포인트는 명령 대체에서 다음과 같다는 것입니다.명령은 서브쉘에서 실행됩니다.즉, 변수에 대한 모든 변경 사항은 기본 스크립트를 실행하는 셸로 역전파되지 않습니다. 따라서 내부적으로 의 명령을 실행 doSomething하고 변수를 설정하는 number동안 스크립트를 실행하는 셸 프로세스와 아무 관련이 없는 자체 셸 프로세스에서 수행합니다( 검색 중이 8라는 사실은 제외 ). 기본 스크립트에서 사용한 stdout변수는 수정할 수 없습니다 .number

더 자세히 읽어보려면 다음을 참조하세요.

여기 이 사이트에서 또는

자세한 내용은


(1) 반면에 이는 명령 대체를 사용하여 스크립트 작성 당시 이름을 모르는 명령을 실행할 수 있지만 알고 있는 다른 명령을 실행하면 알아낼 수 있음을 의미합니다.

관련 정보