6

たとえば、を使用してローテーションバックアップを実行するbashシェルスクリプトを記述したいと思いますrsync。スタンドアロンのスクリプトファイル(backup.sh)として配置する必要がありますか、それとも関数()でラップする必要がありますbackupか?スクリプトファイルとして、私はそれを実行することができますbash backup.shfoo.sh機能として、ログインするたびになどのファイルに入れてソースを設定backupし、コマンドとして実行するだけでファイルをバックアップできます。問題は、2つの戦略の短所と長所は何ですか?

または、より一般的には、どのような状況で、スタンドアロンのシェルスクリプトファイルまたはシェル関数として機能を実装する必要があるのでしょうか。

私の考えのいくつか:ログイン時にいくつかのグラフィカルセッション(KDE、Gnomeなど)が異なるファイルをソースすることを知っています。グラフィカルに起動されたアプリケーションでシェル関数を使用したい場合(アイコンをクリックしてemacsを開くなど)、混乱を招く可能性があります。しかし、私はシェル関数として実装し、それらをファイルにまとめることを好みます。これは、きちんと整理されていると思います。

他のアイデアや提案はありますか?

4

2 に答える 2

4

よく使うものに関数を使いましょう。それらはメモリを消費し、シェルの開始時に解析を必要とします—関数を使用しない場合に無駄になる解析。

時間がかかり、めったに行わないことにはスクリプトを使用します。呼び出しごとの解析時間はごくわずかであり、スクリプトを分離することで明確になることは有益です。

したがって、バックアップスクリプトには、関数ではなくスクリプトを強くお勧めします。

于 2012-08-31T16:15:20.927 に答える
1

Pythonのようなソリューション:

#!/bin/bash

caller_shlvl=$1
shift

backup () {
    ...
}

if (( $caller_shlvl < $SHLVL )); then
    backup "$@"
fi

次の2つのいずれかを実行できます。

bash script.sh $SHLVL other args

スクリプトを呼び出すときにバックアップを実行する、または

source script.sh $SHLVL
# Time passes
backup firstarg secondarg etc

これは、現在のシェルで関数を定義しますが、実行はしません。

(明示的な最初の引数として$ SHLVLを渡す必要があるのは、Pythonのシミュレーションに最も近いものです。

if __name__=="__main__":

かわいくないので、おそらくこの答えはあまり役に立たないでしょう。)

于 2012-08-31T16:25:05.787 に答える