![제한된 횟수 동안 bash에서 명령 시도](https://rvso.com/image/1543335/%EC%A0%9C%ED%95%9C%EB%90%9C%20%ED%9A%9F%EC%88%98%20%EB%8F%99%EC%95%88%20bash%EC%97%90%EC%84%9C%20%EB%AA%85%EB%A0%B9%20%EC%8B%9C%EB%8F%84.png)
기능에서 명령을 다시 시도하고 싶었습니다. 테스트를 위해 잘못된 명령( )을 작성했습니다 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
(as $CMD
)가 다시 실행되고 처음부터 설명할 수 있습니다.
$CMD
Bash는 결코 내부를 지나치지 않습니다 RETRY
. 두 함수가 서로 호출하면 점점 더 많이 쌓입니다. 그들 중 누구도 실제로 나가지 않습니다.
나는 당신의 전체 접근 방식에 결함이 있다고 생각합니다. 정확한 목적이 무엇인지는 모르겠지만 "제한된 횟수 동안 명령을 시도"하는 것이 출발점이 될 수 있습니다.
(max=5; for n in `seq 1 $max`; do your_command && break; done)
$max
서브쉘은 현재 쉘을 벗어나기 위해 사용됩니다 . 전체 명령은 매우 정상적인 종료 코드를 반환합니다.