親プロセス(bash、sh、またはksh)で関数をエクスポートして、親プロセスから起動されたすべての子プロセスで関数を使用できるようにする方法を教えてください。
親プロセス(bash、sh、またはksh)で関数をエクスポートして、親プロセスから起動されたすべての子プロセスで関数を使用できるようにする方法を教えてください。
回答:
このexport -f
機能はBashに固有です。
親
#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21
子
#!/bin/bash
echo $(plus1 $(($1 * $2)) )
ではsh
、Charles Duffyが指摘しているように、関数をエクスポートすることはできません。
kshまたはzshを使用している場合:
FPATH
すべての関数を配置できる環境変数を使用できます。
場合は、FPATH
対話インタプリタに設定され、コマンドや関数は、現在のシェル環境に見つからないかPATH
、ディレクトリが欠落しているコマンドの後に指定したファイルの存在のためにそこに検索され記載されています。見つかった場合、それは現在のシェル環境で供給され、関数を定義することが期待されます。
したがって、すべての関数をの場所に配置FPATH
でき、子スクリプトもそれを見つけることができます。
autoload
シェルスクリプトでコマンドを使用して、必要な関数をロードできます。
autoload fun_a fun_b
zshでは、動作autoload
するためFPATH
に必要です。 でksh
、その近親者、私はそれは、単純に定義された関数原因と信じてFPATH
、彼らが直接定義されてしまうかのように、PATHに定期的にコマンドを上書きします。
FPATH
およびに関するいくつかの詳細autoload
:
でサブシェルを作成すると( )
、それらはすべての定義、パラメーター、およびシェル変数のスナップショットを継承します。
プログラムのように実行する場合は、定義をに入れることができます.bashrc
。
既存のスクリプトをスプーフィングしてラッパーまたはPATHコマンドの置換を実行しようとしている場合.bashrc
は、実行の詳細に応じて機能します。そうでない場合は、代わりに、関数を定義するインクルードファイルの.
またはsource
を実行するラッパースクリプトを実行し、代わりに使用するコマンドを使用してシェルスクリプトで同じことを実行できます。
ラッパースクリプトは次のようになります。
script=$1
shift
. include.sh
. $script "$@"
最初のパラメーターは実際のスクリプトの名前であり、残りのパラメーターは引数であるという考え方です。その後、上記のスクリプトが代わりに実行されます。
declare -x -f NAME
より詳しい情報
-fアクションまたは表示を関数名と定義に制限します -xを使用してNAMEをエクスポートします
bash
注意してください。(ksh
の、、に対応するdeclare
ものtypeset
には-x
オプションがありますが、変数にのみ適用され、関数には適用されません。同上zsh
)。