内部に多くの関数を含むスクリプトがあります。
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 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
そして、UNIX 名を取得するために をsomecmd
実行していたのですが、システムの実際の名前 ( 、...)ではなくが使用されるシステムで が取得されていました。popen("uname", "r")
Gotcha
sh
bash
Darwin
Linux