오류가 발생할 수 있는 명령을 실행하고 있습니다.
cmd sub-cmd --param1 value1 --param2 value2
이 명령은 오류를 반환할 수 있습니다. 오류 메시지는 특정 문자열로 끝나는 특정 오류 메시지입니다(시작은 다르지만 끝은 항상 동일함). cmd
특정 문자열로 끝나는 오류 메시지가 특정 횟수(예: 5회) 반환되는 경우 동일한 명령을 다시 시도하기 위한 작은 쉘 스크립트 코드를 찾고 있습니다 . 또한, 매개변수가 허용된다는 점에 유의하십시오 cmd
. 나는 쉘 스크립트가 내 것이 무엇이든 전달할 수 있기를 원합니다 cmd
. 오류 메시지가 내가 찾고 있는 메시지가 아닌 경우, 쉘 스크립트는 오류를 반환하고 중지( exit(1)
). 감사해요.
답변1
그런 다음 명령의 출력을 캡처해야 합니다. 모든 것을 캡처할 수 있다면(또는 표준 출력을 무시할 수 있다면) 가장 간단합니다.
#!/bin/bash
errormsg=$( cmd "$@" 2>&1 >/dev/null )
re="known error message$"
if [[ $errormsg =~ $re ]]; then
echo "cmd failed with known message
fi
그 안의 명령 대체 $(..)
및 리디렉션은 명령의 표준 오류 출력을 캡처하고 오류가 아닌 출력을 로 리디렉션합니다 . 그런 다음 이를 문자열의 끝이 문자열의 끝을 나타내는 /dev/null
정규식과 비교합니다 . $
(명령 대체는 후행 줄 바꿈을 제거하므로 정규 표현식이 이러한 줄 바꿈과 일치할 필요가 없습니다.) "$@"
스크립트의 인수로 확장하여 에 인수로 전달합니다 cmd
.
물론 프로그램을 반복적으로 실행하려면 루프가 필요합니다. 명령 대체의 대안은 임시 파일을 사용하여 오류 출력을 저장하고 나중에 보는 것입니다. 또한 명령의 표준 출력을 표시하는 것이 더 쉬워지므로 다음과 같이 합시다.
#!/bin/bash
re="known error message$"
retries=0
max_retries=5
errorfile=$(mktemp) # temp file for the errors
trap 'rm "$errorfile"' EXIT # remove the temp file on exit
while cmd "$@" 2> "$errorfile"; # run the command
ret=$?; # save the exit code
[[ $( < $errorfile ) =~ $re ]]; do # check the output
cat "$errorfile" >&2 # print the errors to
# the script's stderr, too
retries=$((retries+1)) # retry a couple of times
echo -n "cmd failed with known message"
if [[ $retries -lt $max_retries ]]; then
echo ", retrying."
else
echo ", exit."
exit 1
fi
done
cat "$errorfile" >&2
echo "cmd completed with status $ret"; # use saved exit code, since it might
exit "$ret" # have failed for other reasons
( while cmd1; cmd2; do ...
달리다지침 1먼저 실행한 다음지침 2루프 조건으로. )
위에서는 명령의 실제 종료 상태를 무시하고 출력만 살펴보았습니다. 종료 상태를 고려하려면 스크립트를 변경해야 합니다.