2016-07-20 10 views
1

以前に失敗した定義済みのステップでbashスクリプトを再起動するソリューションを探しています。Bash - 手順によるエラー回復

例えば、私はbashスクリプトを持っている:それはstep 3で失敗

#my_script.sh: 

    #Step 1 
    Action 1 

    #Step 2 
    Action 2 

    #Step 3 
    Action 3 

    #Step 4 
    Action 4 

した後、私はこのようにそれを呼び出すことができるようにしたいと思います:

./my_script.sh step3

だから、 step 3から開始し、first 2の手順をやり直してください。

アイデア?ありがとう

+0

はあなたの人生とあなたの同僚の人生を容易にし、*本物*プログラミング言語を使用することを検討してください。 – hek2mgl

+0

@ hek2mglシェルが使用する言語が間違っているかどうかを知るには十分な詳細がありません。アクションが他の問題を実行するだけなら、シェルは確かに良い選択です。 – chepner

+0

@chepner実際にあなたが正しいです、私はそれを投稿した後自分自身を考えていました。 ;)しかし、私はそれを削除するために逃した。それでも私たちがどれくらい愛用しているかにかかわらず、シェルは単にアプリケーション開発のための間違ったツールであると私は言います。本当に限られた仕事で大丈夫です。複雑さの場合には制限があります。時間が経つにつれて最初のタスクが変わった場合、ほとんど常に時間がかかります。おそらく間違った質問の下の正しいコメント。 – hek2mgl

答えて

0

あなたは入力として入力するようにコードを書くことができます。開始のステップは、./my_script.sh 3です。あなたのコードには、入力として与えられたステップである "入力"として取るcaseステートメント$1を使用することができます。私はあなたのためのコードを書いていないが、さらに助けが必要な場合は、あなたのソリューションを投稿して、私はあなたにいくつかのヒントを与えることをうれしく思っています。

3

ステップ2が失敗した場合は、そこから再起動したいと考えています。ステップNは前のステップ1 .. N-1に依存しています。

これを解決する方法の1つは、スクリプトを実行するときにスタンプスタンプを作成することです。

だけなど、あなたがステップ2で行われているときにはステップ1、touch step2-stampで行われているtouch step1-stamp

そのステップのスタンプがために、例えば、そのタスクを実行する前に存在している場合、各ステップは、チェックしますステップN

if [ ! -f "stepN-stamp" ]; then 
    # do tasks for step N 
    touch stepN-stamp 
fi 

のMakefileと同様のアプローチ:

.PHONY: all clean 

all: step3-stamp 

step1-stamp: 
    @echo "Performing step 1" 
    @touch step1-stamp 

step2-stamp: step1-stamp 
    @echo "Performing step 2" 
    @touch step2-stamp 

step3-stamp: step2-stamp 
    @echo "Performing step 3" 
    @touch step3-stamp 

clean: 
    rm -f step[123]-stamp 

注:これは、すべての「あなたがドンと仮定していますランダムなステップを実行したい。 になります。1つまたは複数のスタンプファイルを削除し、最初からすべてのプロセスを再実行します。特にMakefileソリューションは、これを適切に処理して、従属ステップの再実行を強制します。

+0

非常に良いアイデア!ステップNのスタンプが作成されると、スタンプをステップN-1で削除することも提案する。 – mik1904

+0

@ mik1904いいえ、あなたはすべてが完了したらスタンプを削除します。シェルスクリプトソリューションでは、 'N 'が完了したときにスタンプ' N-1'を削除すると、スクリプトを再実行すると 'N-1'タスクが再実行されます。 Makefileソリューションでは、「N」が完了したときにスタンプ「N-1」を削除すると、「N-1」ステップおよびすべての後続ステップ(すなわち、ステップ「N-1」に依存する各ステップ)が再実行されるmakeを再実行する。 – Kusalananda

+1

私は、スクリプトを実行するたびにすべてのスタンプをチェックし、存在する場合は移動するので、参照してください。つまり、すべて自動であるため、ステップとして入力しないでください。申し訳ありません、今私は理解しています。非常に良いもの。 – mik1904

1

ターミネータでのcaseステートメントでのフォールスルー動作が導入されました。

このスクリプトを実行
# Contents of script 
case ${1:-step1} in 
    step1) echo "Running step 1" ;& 
    step2) echo "Running step 2" ;& 
    step3) echo "Running step 3" ;& 
    step4) echo "Running step 4" ;& 
    step5) echo "Running step 5" ;; 
    *) echo "Unrecognized starting point: $1"; exit 1 ;; 
esac 

$ bash script step3 
Running step 3 
Running step 4 
Running step 5