関数定義のみを含むスクリプトを作成しますか?または、関数本文のコードをスクリプトに移動しますか?

関数定義のみを含むスクリプトを作成しますか?または、関数本文のコードをスクリプトに移動しますか?

いくつかの背景:Bashで再利用可能なコードを書くとき、私はいくつか見ました。 複数の関数定義を含むシェルスクリプト。時には、スクリプトに定義された関数が関連しているのか、スクリプトが実際に混乱しているのか、複数の関数を1つのスクリプトで構成する方法がわからないのかわかりません(この目的に関する提案はありますか?)。だから、1つの関数定義だけを含むスクリプトを書くつもりですが、複数のファイルを整理する必要があるようです。 1つのスクリプトに複数の関数定義を構成することと、それぞれ関数定義を含む複数のスクリプトファイルを構成する方法のどちらが優れていますか?

以下では、1つの関数定義のみを含むスクリプトを作成するとします。


私の実際の質問ここから始めましょう:

執筆中1つの関数定義のみを含むスクリプト、私は書くことができます

#! /bin/bash

function myfunc() {
    echo $1, $2, $3
    # do some work...
}

それから私は書くことができます。

source /path/to/myscript
myfunc 1 2 3

あるいは、関数定義を削除して関数本体のコードをスクリプトに移動して、同じコード再利用性目標を達成することもできます。

#! /bin/bash

echo $1, $2, $3
# do some work...

それから私は書くことができます。

source /path/to/myscript 1 2 3

? 2番目の方法はスクリプトの内容や使い方の面で最初の方法よりもきれいに見えますが、何らかの理由で2番目の方法を嫌う人がいるかどうかはわかりません。上記の2つの方法の長所と短所が何であるかを知りたいです。実際にどのようなアドバイスをしてくれますか?

実際に最初のアプローチを使用している場合は、スクリプト名を関数と同じにしますか?つまり、スクリプトにという関数が含まれている場合は、myfuncスクリプト名もとして指定しますかmyfunc

ありがとうございます。

ベストアンサー1

私は状況に応じて両方します。ほとんどの場合、これらの関数を使用する同じスクリプトで宣言しますが、すべてのスクリプト間で共有したい変数と関数ファイルを含むスクリプト「キット」があります。

機能するかどうか

関数の主な目的はDRY(繰り返しません)です。スクリプトで何度も使用されるコードがある場合は、関数に存在する必要があります。

繰り返されないコードで関数を使用することは好ましい問題です。何人かの人々(私自身を含む)はそれがよりきれいだと思います。また、「実際の」プログラミング言語が使用される方法に似ていると思います。

Googleのシェルスタイルガイドコードに1つ以上の関数が含まれている場合は、「main」関数をすべてのコードの周りのラッパーとして使用する必要があることに注意してください。 (本質的に、スクリプトは単一の呼び出しで終わる一連の関数宣言ですmain。)

単一スクリプト内で関数宣言(またはコードを書く)

  • シンプルさ(コードを見る人は誰でも各関数の機能を簡単に追跡できます)
  • 移植性の向上(あるシステムから別のシステムに1つのファイルのみを移動)

単一のタスクを実行するためのスタンドアロンスクリプトを作成する場合は、これが正しい選択である可能性があります。

別のファイルへの関数宣言

  • DRY(繰り返しないでください)
  • 管理が簡単になります。

多くの共通機能を共有するツールセットを作成する場合は、これが正しい選択である可能性があります。

私の例には、ツールキットのスクリプトのすべてまたは少なくともほとんどで使用される機能があります。これには、在庫管理システムを照会し、サーバーに関する情報(IPアドレス、オペレーティングシステムのバージョンなど)を返す機能が含まれます。この情報は多くのツールに役立つので、すべてのファイルではなく1つのファイルでこれらの関数を宣言するのは妥当です。別のファイル。また、最近の在庫管理システムを変更して10個以上の異なるファイルを変更する代わりに、新しいシステムに照会するために共通ファイルのみを変更する必要があり、他のファイルは変更なしで機能しました。

これのいくつかの欠点は、より複雑であることです。各ファイルには、この共通ファイルをインポートするための次のステートメントがあります。

if [[ -f "${0%/*}/lib/common.sh" ]]; then
    . "${0%/*}/lib/common.sh"
else
    echo "Error! lib/common.sh not found!"
    exit 1
fi

ユーザーがツールキットをインポートしてディレクトリ構造を変更したり、ディレクトリ構造全体をインポートできなかった場合、パブリックファイルをインポートできないため、ツールは期待どおりに機能しません。

おすすめ記事