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少し誤解を招きます。

Now はbash、環境に関数をエクスポートできる数少ないシェルの 1 つです (実際には、bashコマンドのみが理解できる特別な環境変数を使用します)。これは、bash 固有のコマンドを使用して実行できますexport -f。オプションがオンになっているbash間に宣言されたすべての関数もエクスポートします。allexport

しかし、いずれにせよ、あなたのケースではどちらも機能しません。exportあるシェルから何かを実行すると、それが変数であれ関数であれ、その変数/関数がそのシェルの他のシェルで使用できるようになります。実行する(輸出とは、実行)。

myfile1.shしたがって、または がmyfile2.sh宣言した関数をエクスポートしたとしても(変数宣言の前にexport -fまたは を置くことによって)、その影響は、それらのスクリプトを解釈するシェルが実行するシェルにのみ及びます。ここではは実行されておらず、その逆になっています。set -o allexportmyfile2.shmyfile3.sh

ここでスクリプトで次の操作を実行する必要がありますmyfile3.sh

source path/to/myfile2.sh

そうすれば、すべてのmyfile1.shmyfile2.shおよびmyfile3.shスクリプト内のコードを同じシェルで解釈し、関数をエクスポートする必要がなくなります。

shが であるシステムではbash、関数をエクスポートするのはおそらく良い考えではないことに注意してください。これは、スクリプトが (再帰的に) 実行するすべての sh および bash スクリプトとシェル コマンド ラインに影響するためです。たとえば、次のようにした場合:

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

そして、UNIX 名を取得するために をsomecmd実行していたのですが、システムの実際の名前 ( 、...)ではなくが使用されるシステムで が取得されていました。popen("uname", "r")GotchashbashDarwinLinux

関連情報