![스크립트 함수 호출: 함수 및 $(function)](https://linux55.com/image/192236/%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%ED%95%A8%EC%88%98%20%ED%98%B8%EC%B6%9C%3A%20%ED%95%A8%EC%88%98%20%EB%B0%8F%20%24(function).png)
단순화를 위해 다음 코드를 참조하십시오.
#!/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)
그러면 Linux 시스템에서 콘솔에 uname
인쇄되고 결과가 쉘 변수에 저장되는 명령이 실행됩니다 . 따라서 아무것도 출력하지 않는 명령이나 함수를 사용하십시오(예: 귀하의 것과 같습니다 . 실제로 교체는 기본적으로 출력에 대한 자리 표시자 이므로 스크립트 오류가 발생하지 않는 유일한 이유는 함수가 출력하지 않는다는 것입니다 예를 들어, 무엇이든 말했나요?Linux
os_type
doSomething
$(doSomething)
doSomething
$(uname)
바꾸다
$(doSomething)
쉘은 명령을 실행 Linux
하고 생성을 시도합니다.
Linux: No such file or directory
오류 (1) .
관찰하고 있는 효과를 이해하는 핵심 포인트는 명령 대체에 있습니다.이 명령은 서브쉘에서 실행됩니다.즉, 변수에 대한 모든 변경 사항은 기본 스크립트를 실행하는 셸로 역전파되지 않습니다. 따라서 내부적으로 명령을 실행 doSomething
하고 변수를 number
로 설정하는 동안 8
자체 쉘 프로세스에서 이 작업을 수행하며 이는 스크립트를 stdout
검색하는 것 외에는 스크립트를 실행하는 쉘 프로세스와 아무 관련이 없습니다. number
기본 스크립트에서 사용하는 변수는 수정할 수 없습니다 .
더 자세한 내용을 보려면 다음을 확인해 보세요.
이 웹사이트에서 또는
더 많은 개요를 확인하세요.
(1) 반면, 이는 명령 대체를 사용하여 스크립트를 작성할 때 이름을 모르는 명령을 실행할 수 있지만 알고 있는 다른 명령을 실행하면 명령의 이름을 알아낼 수 있다는 의미입니다. .