関数内のコマンドを再試行したいのですが、テストのために間違ったコマンド ( ) を記述しました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
$CMD
Bash は内部を通過することはありませんRETRY
。2 つの関数が互いを呼び出し、どんどんスタックされていきます。実際にはどちらも終了しません。
あなたのアプローチ全体に欠陥があると思います。正確な目的はわかりませんが、「コマンドを限られた回数だけ試す」ことが出発点になるかもしれません。
(max=5; for n in `seq 1 $max`; do your_command && break; done)
サブシェルは、$max
現在のシェルから抜け出すために使用されます。コマンド全体が非常に正常な終了コードを返すことに注意してください。