シェルで関数をエクスポートする


回答:


105

このexport -f機能はBashに固有です。

#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21

#!/bin/bash
echo $(plus1 $(($1 * $2)) )

2
エクスポートされた関数は子呼び出しでのみ使用できますか?現在のbashセッションに適用するにはどうすればよいですか?同様の.bashrcの書き込みに、唯一の現在のbashのインスタンスのための...
vp_arth

3
@vp_arth:子呼び出しで関数が必要ない場合は、エクスポートする必要はありません。どちらの方法でも現在のセッションで使用できます(ファイルで定義されている場合は、現在のセッションで使用できるようにするために実行するのではなく、ファイルをソースする必要があることに注意してください)。
追って通知があるまで一時停止します。


3

kshまたはzshを使用している場合:

FPATHすべての関数を配置できる環境変数を使用できます。

場合は、FPATH対話インタプリタに設定され、コマンドや関数は、現在のシェル環境に見つからないかPATH、ディレクトリが欠落しているコマンドの後に指定したファイルの存在のためにそこに検索され記載されています。見つかった場合、それは現在のシェル環境で供給され、関数を定義することが期待されます。

したがって、すべての関数をの場所に配置FPATHでき、子スクリプトもそれを見つけることができます。

autoloadシェルスクリプトでコマンドを使用して、必要な関数をロードできます。

autoload fun_a fun_b

zshでは、動作autoloadするためFPATHに必要です。ksh、その近親者、私はそれは、単純に定義された関数原因と信じてFPATH、彼らが直接定義されてしまうかのように、PATHに定期的にコマンドを上書きします。

FPATHおよびに関するいくつかの詳細autoload


1

でサブシェルを作成すると( )、それらはすべての定義、パラメーター、およびシェル変数のスナップショットを継承します。

プログラムのように実行する場合は、定義をに入れることができます.bashrc

既存のスクリプトをスプーフィングしてラッパーまたはPATHコマンドの置換を実行しようとしている場合.bashrcは、実行の詳細に応じて機能します。そうでない場合は、代わりに、関数を定義するインクルードファイルの.またはsourceを実行するラッパースクリプトを実行し、代わりに使用するコマンドを使用してシェルスクリプトで同じことを実行できます。

ラッパースクリプトは次のようになります。

script=$1
shift
. include.sh
. $script "$@"

最初のパラメーターは実際のスクリプトの名前であり、残りのパラメーターは引数であるという考え方です。その後、上記のスクリプトが代わりに実行されます。


2
これらをコーディング例で説明していただけますか。関数を.bashrcに入れたくない
Sachin Chourasiya 2009

1
declare -x -f NAME

より詳しい情報

-fアクションまたは表示を関数名と定義に制限します
-xを使用してNAMEをエクスポートします

6
これはに固有であることにbash注意してください。(kshの、、に対応するdeclareものtypesetには-xオプションがありますが、変数にのみ適用され、関数には適用されません。同上zsh)。
mklement0 2014年

0

関数は本質的にエクスポートできません。ただし、文字列をエクスポートできるので、ここで少しトリックがあります。

func="$(typeset -f funcname)"
export func

関数をインポートするには、エクスポートされた文字列から関数を再定義します。

# in subshell
eval "$func"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.