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이 없으면 POSIX와 유사한 쉘(bash가 아닐 수 있음)로 해석됩니다. bash스크립트에서 특정 기능을 사용 하려는 경우 다음 사항이 있는지 확인해야 합니다.

#! /path/to/bash -

she-bang 또는 당신이 그것을 부르는 것처럼 bash path/to/the/script또한 .sh해당 언어로 작성된 스크립트를 확장하는 것은 bash약간 오해의 소지가 있습니다.

이제는 bash기능을 환경으로 내보낼 수 있는 몇 안 되는 쉘 중 하나입니다(실제로는 bash명령으로만 이해되는 특수 환경 변수를 사용함). 이는 export -fbash 특정 명령을 사용하여 수행할 수 있습니다. 이 옵션이 켜져 있을 bash때 선언된 모든 함수도 내보내집니다 .allexport

그러나 어쨌든 이들 중 어느 것도 귀하의 상황에 적합하지 않습니다. export해당 쉘 내의 다른 쉘에서 변수/함수를 사용할 수 있도록 하나의 쉘에서 변수이든 함수이든 무언가를 가져옵니다.구현하다(내보내기는 물건을 저장하는 것입니다구현하다).

myfile1.sh따라서 (변수 선언 이전에 변수 선언을 사용 하거나 통해 ) myfile2.sh선언한 함수를 내보내는 경우에도 이를 실행할 스크립트를 해석하는 셸에만 영향을 미칩니다. 여기서는 실행이 아니라 그 반대입니다.export -fset -o allexportmyfile2.shmyfile3.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")GotchashbashDarwinLinux

관련 정보