bash でコマンドを限られた回数だけ試す

bash でコマンドを限られた回数だけ試す

関数内のコマンドを再試行したいのですが、テストのために間違ったコマンド ( ) を記述しましたlsss。5 回試行して失敗するはずですが、無限ループに陥っています。

#!/bin/bash

RETRY () {

        Attempt=0
        Max_Attempts=5
        CMD=$1
        while [ $Attempt -lt $Max_Attempts ]
        do
            $CMD

        if [ $? -eq 0 ]; then
           echo "succeeded on Attempt $Attempt" >> /tmp/err.txt
            break
        else
                 Attempt=$( expr $Attempt + 1 )
        echo  "Command failed. Attempting  $Attempt/$Max_Attempts" >> /tmp/err.txt
                 sleep 2
        fi
done

}

LIST () {

        lsss  # COMMAND WRITTEN WRONGLY FOR TESTING

        if [ $? -eq 0 ]; then
         echo "SUCCESS" 
        else
        RETRY LIST

        echo "FAILED" 
        fi
}
LIST

答え1

あなたの「質問」には疑問がありません。質問は「なぜ?」だと思います。

LISTを実行すると必ずlsss失敗するので、RETRY LISTが呼び出されます。その後、 ( の内部からとしてRETRY)が再度実行され、最初から説明できます。LIST$CMD

$CMDBash は内部を通過することはありませんRETRY。2 つの関数が互いを呼び出し、どんどんスタックされていきます。実際にはどちらも終了しません。


あなたのアプローチ全体に欠陥があると思います。正確な目的はわかりませんが、「コマンドを限られた回数だけ試す」ことが出発点になるかもしれません。

(max=5; for n in `seq 1 $max`; do your_command && break; done)

サブシェルは、$max現在のシェルから抜け出すために使用されます。コマンド全体が非常に正常な終了コードを返すことに注意してください。

関連情報