실패 할 때까지 쉘 명령을 반복해서 실행 하시겠습니까?


190

신뢰할 수없는 퍼지 테스트를 작성했습니다 . 디버그 코드를 추가했지만 이제는 실패 할 때까지 테스트를 실행하여 디버그 출력을 수집하려고합니다.

다음을 사용하여 테스트를 실행할 수 있도록 테스트를 설정했습니다.

./runtest

내 현재 해결책은 untilfail스크립트 를 작성하는 것입니다 .

#!/bin/bash
$@
while [ $? -eq 0 ]; do
    $@
done

그런 다음 사용하십시오.

untilfail ./runtest

더 간단한 해결책이 있습니까?


11
참고 : 습관적으로 "$ @"을 인용하십시오.
jordanm

답변:


326

while 실행할 명령을 사용하므로 더 간단하게 사용할 수 있습니다.

while ./runtest; do :; done

0이 아닌 종료 코드 (일반적으로 실패를 나타냄)를 ./runtest반환 하면 루프가 중지됩니다 .

현재 솔루션을 더 단순화하려면 다음과 같이 untilfail 스크립트를 변경해야합니다.

#!/bin/bash

while "$@"; do :; done

그런 다음 이미 사용중인 명령으로 호출 할 수 있습니다.

untilfail ./runTest --and val1,val2 -o option1 "argument two"

25
그것은 또한 [명령 이라는 것을 지적하는 것이 좋습니다 . 새로운 사용자의 [일부 if이며 while구문에 대한 일반적인 오해입니다 .
jordanm

2
실패하기 전에 실행 한 횟수를 어떻게 알 수 있습니까?
GrantJ

13
@GrantJ : 실제로 정말 간단합니다. 넣어 count=0루프 전에, 다음 대신 :루프 (무 연산)에 넣어 (( count++ ))-이 단위를 카운터.
nneonneo

14
생산성 해킹 : say스피커가 있는 시스템과 스피커를 사용 while ./runtest; do :; done && say test failed하는 경우 중지되면 알림을받을 수 있습니다.
Schneems

5
@Schneems : saymacOS에 따라 다릅니다.
nneonneo

13

복잡한 파이프 라인을 쉘 스크립트 또는 함수로 감싸고 싶지 않으면 다음과 같이 작동합니다.

while true; do 
  curl -s "https:..." | grep "HasErrors.:true"
  if [[ "$?" -ne 0 ]]; then 
    break
  fi
  sleep 120
done

이 경우 HTTP 요청은 항상 200을 반환하지만 오류가있을 경우 속성이 "HasErrors": true 인 일부 JSON도 반환합니다.


1

쉘 재시도 로직이 모든 곳에서 복제되는 시스템에서 비슷한 문제가 발생하여이 문제를 "재시도"라고하는 전용 도구를 만들었습니다.

retry --until=fail ./runtest

더 복잡한 예 :

retry --until=fail --message="test succeeded" --delay=1 ./runtest

https://github.com/minfrin/retry 에서 제공되는 도구 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.