많은 기능이 포함된 스크립트가 있습니다.
myfile1.sh:
func1() {}
func2() {}
스크립트를 통해 호출할 수 있습니다.
myfile2.sh:
source myfile1.sh
func1
func2
하지만 중첩된 스크립트에서 시작되는 경우 어떻게 호출합니까?
myfile3.sh:
./myfile2.sh
func2
func2: command not found
myfile2
모든 사람이 알 수 있도록 기능을 "내보낼" 수 있나요 ?
export -f
기능이 너무 많아서 못쓰겠어요 .
답변1
참고로, bash
아니 sh
. 쉘 export -f
에 따라 다릅니다.bash
스크립트에 she-bang이 없으면 POSIX와 유사한 쉘(bash가 아닐 수 있음)로 해석됩니다. bash
스크립트에서 특정 기능을 사용 하려는 경우 다음 사항이 있는지 확인해야 합니다.
#! /path/to/bash -
she-bang 또는 당신이 그것을 부르는 것처럼 bash path/to/the/script
또한 .sh
해당 언어로 작성된 스크립트를 확장하는 것은 bash
약간 오해의 소지가 있습니다.
이제는 bash
기능을 환경으로 내보낼 수 있는 몇 안 되는 쉘 중 하나입니다(실제로는 bash
명령으로만 이해되는 특수 환경 변수를 사용함). 이는 export -f
bash 특정 명령을 사용하여 수행할 수 있습니다. 이 옵션이 켜져 있을 bash
때 선언된 모든 함수도 내보내집니다 .allexport
그러나 어쨌든 이들 중 어느 것도 귀하의 상황에 적합하지 않습니다. export
해당 쉘 내의 다른 쉘에서 변수/함수를 사용할 수 있도록 하나의 쉘에서 변수이든 함수이든 무언가를 가져옵니다.구현하다(내보내기는 물건을 저장하는 것입니다구현하다).
myfile1.sh
따라서 (변수 선언 이전에 변수 선언을 사용 하거나 통해 ) myfile2.sh
선언한 함수를 내보내는 경우에도 이를 실행할 스크립트를 해석하는 셸에만 영향을 미칩니다. 여기서는 실행이 아니라 그 반대입니다.export -f
set -o allexport
myfile2.sh
myfile3.sh
myfile3.sh
여기서 수행할 스크립트가 필요합니다 .
source path/to/myfile2.sh
이렇게 하면 스크립트의 모든 코드를 해석하는 동일한 셸이므로 myfile1.sh
함수를 내보낼 필요가 없습니다 myfile2.sh
.myfile3.sh
sh
시스템에서는 bash
함수를 내보내는 것이 좋은 생각이 아닐 수 있습니다. 이는 모든 sh 및 bash 스크립트와 스크립트가 (재귀적으로) 실행되는 쉘 명령줄에 영향을 미치기 때문입니다. 예를 들어, 다음과 같은 경우:
set -o allexport
uname() { echo Gotcha; }
somecmd
그리고 시스템의 실제 이름( , ...) 대신 시스템에 있을 유닉스 이름을 얻기 위해 somecmd
하나를 수행하고 있습니다 .popen("uname", "r")
Gotcha
sh
bash
Darwin
Linux