Bash에서 기능을 "내보내는" 방법은 무엇입니까?

Bash에서 기능을 "내보내는" 방법은 무엇입니까?

내부에 많은 기능이 포함된 스크립트가 있습니다.

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 -fbash 관련 명령을 사용하여 수행할 수 있습니다 . 또한 옵션이 켜져 있는 bash동안 선언된 모든 함수를 내보냅니다 .allexport

그러나 어쨌든 귀하의 경우에는 둘 중 어느 것도 작동하지 않습니다. export변수이든 함수이든 하나의 쉘에서 무언가를 가져오는 것은 해당 변수/함수를 해당 쉘이 사용하는 다른 쉘에서 사용할 수 있도록 하는 것입니다.실행(내보내기는 전체 내용을 보존하는 것입니다.실행).

따라서 선언한 함수를 내보내 myfile1.sh거나 변수 선언 이전에 변수 선언을 사용하여 내보낸 경우에도 해당 스크립트를 해석하는 셸이 실행하는 셸에만 영향을 미칩니다. 여기는 실행되지 않습니다 . 반대입니다.myfile2.shexport -fset -o allexportmyfile2.shmyfile3.sh

myfile3.sh여기서 수행하려면 스크립트가 필요합니다 .

source path/to/myfile2.sh

모든 myfile1.sh, myfile2.shmyfile3.sh스크립트의 코드를 해석하는 동일한 셸이므로 함수를 내보낼 필요가 없습니다.

sh가 있는 시스템에서는 bash함수를 내보내는 것이 좋지 않을 수 있습니다. 이는 스크립트가 (재귀적으로) 실행하는 모든 sh 및 bash 스크립트와 셸 명령줄에 영향을 미치기 때문입니다. 예를 들어 다음과 같이 했다면:

set -o allexport
uname() { echo Gotcha; }
somecmd

그리고 유닉스 이름을 얻기 위해 somecmda를 수행 하면 시스템의 실제 이름( , ...) 대신 에 시스템에 표시 됩니다 .popen("uname", "r")GotchashbashDarwinLinux

관련 정보