多くの機能を含むスクリプトがあります。
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
スクリプトにシェーバンがない場合は、POSIXに似たシェル(bashではない可能性がある)として解釈されます。bash
スクリプトで特定の機能を使用する場合は、次の点があることを確認する必要があります。
#! /path/to/bash -
she-bangまたはあなたがそれを呼ぶように、その言語bash path/to/the/script
で.sh
書かれたスクリプトを拡張することはbash
少し誤解を招くかもしれません。
これで、bash
機能を環境にエクスポートできる数少ないシェルの1つです(実際には、bash
コマンドでのみ理解される特殊な環境変数を使用しています)。これはexport -f
bash固有のコマンドを使用して行うことができます。このオプションがオンのbash
場合、宣言されたすべての関数もエクスポートされます。allexport
しかし、とにかくこれらのどれもあなたの状況には適していません。export
そのシェル内の他のシェルで変数/関数を使用できるように、1つのシェルから変数でも関数でも何かを取得します。実装する(エクスポートは商品を保存することです実装する)。
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
1つを実行しています。popen("uname", "r")
Gotcha
sh
bash
Darwin
Linux