web-dev-qa-db-ja.com

関数を複数のスクリプトでどのように再利用しますか?

Bashでは、いくつかのスクリプトで関数を再利用したい場合があります。すべてのスクリプトで関数の定義を繰り返すのは悪いことですか?もしそうなら、いくつかの良い習慣は何ですか?

次の方法は良い考えですか?

  • 関数の定義myfunctionを独自のスクリプトdefine_myfunction.shでラップします。
  • 関数が呼び出されるすべてのスクリプトでsource define_myfunction.sh、次に関数myfunction arg1 arg2 ...を呼び出します。

ありがとう。

6
Tim

bashでは、そうするのが良い方法です。

sourceまたは.を使用して「ライブラリ」スクリプトを調達することは、2つ以上のスクリプト間で関数定義を共有したいという問題に対する適切な解決策です。 「ライブラリ」スクリプトで定義された関数へのアクセスを必要とする各スクリプトは、おそらくスクリプトの上部にある必要なファイルを調達します。

これにより、関連する関数を1つの「ライブラリ」スクリプトに収集し、それを入手してそれらにアクセスできます。

まったく無関係というわけではありませんが、bashシェルには、非インタラクティブシェル(スクリプトなど)を実行すると、自動的にファイルを読み込む機能もあります。これは、スクリプトの特定の環境を設定するために使用できます。

BASH_ENV="$HOME/stuff/script.env" ./myscript

...ここで、script.envは、関数の定義やシェル変数や環境変数の設定から、他のファイルの取得など、何でも実行できます。


ksh93などの一部のシェルには、これらのような関数定義スクリプトを含む可能性のあるディレクトリを指す環境変数があります。 ksh93では、この変数はFPATHと呼ばれます。スクリプト$FPATH/fooには、ユーザーがコマンドライン(またはスクリプト)でfooと入力すると自動的に見つかるfooという関数が含まれます。 bash Shellは私の知る限り、この特定の機能を備えていません。

他のシェルには、他の形式の「自動ロード」機能があります。

3
Kusalananda

この質問は主観的であるというフラグが立てられる可能性がありますが、ホイールを毎回再発明するのではなく、一般的に使用されるコードにライブラリを使用することがベストプラクティスとして一般に受け入れられていると思います。関数と変数を定義するスクリプトをsourceingするのがシェルの方法です。そのため、ライブラリスクリプトを作成してsourceingすることは、おそらく良い方法です。

私は実際にさらに進んで、頻繁に使用するツールとスクリプトを使用してbinPATHディレクトリを作成しました。それらのライブラリスクリプトの一部がそこにあるので、インタラクティブシェルで使用するためにそれらを簡単にsourceできます。

1
DopeGhoti