내부에 많은 기능이 포함된 스크립트가 있습니다.
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이 없으면 bash가 아닐 수도 있는 POSIX와 유사한 쉘로 해석됩니다. 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
a를 수행 하면 시스템의 실제 이름( , ...) 대신 에 시스템에 표시 됩니다 .popen("uname", "r")
Gotcha
sh
bash
Darwin
Linux