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

スクリプトにシェーバンがない場合は、POSIXに似たシェル(bashではない可能性がある)として解釈されます。bashスクリプトで特定の機能を使用する場合は、次の点があることを確認する必要があります。

#! /path/to/bash -

she-bangまたはあなたがそれを呼ぶように、その言語bash path/to/the/script.sh書かれたスクリプトを拡張することはbash少し誤解を招くかもしれません。

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

しかし、とにかくこれらのどれもあなたの状況には適していません。exportそのシェル内の他のシェルで変数/関数を使用できるように、1つのシェルから変数でも関数でも何かを取得します。実装する(エクスポートは商品を保存することです実装する)。

myfile1.shそのため、宣言した関数をエクスポートしても(変数宣言の前に変数宣言を使用するか、または経由して)、myfile2.sh実行するスクリプトを解釈するシェルにのみ影響します。ここでは実行ではなくその逆です。export -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

そして、システムの実際の名前(、...)の代わりに、システムに存在するUnix名を取得するためにsomecmd1つを実行しています。popen("uname", "r")GotchashbashDarwinLinux

関連情報