2012-10-19 26 views
113

Tôi đã viết một bài kiểm tra fuzzy không thành công. Tôi đã thêm một số mã gỡ lỗi, nhưng bây giờ tôi muốn chạy thử nghiệm cho đến khi nó không thành công vì vậy tôi có thể thu thập đầu ra gỡ lỗi.Lặp lại chạy lệnh shell cho đến khi nó thất bại?

tôi đã thiết lập các thử nghiệm vì vậy tôi có thể chạy nó bằng cách sử:

./runtest 

giải pháp hiện tại của tôi là viết một kịch bản untilfail:

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

Sau đó sử dụng nó:

untilfail ./runtest 

Có giải pháp đơn giản hơn không?

+7

Lưu ý phụ: thường xuyên trích dẫn "$ @". – jordanm

Trả lời

185

while mất một lệnh để thực hiện, vì vậy bạn có thể sử dụng đơn giản hơn

while ./runtest; do :; done 

Điều này sẽ ngăn chặn vòng lặp khi ./runtest trả về một mã thoát khác không (mà thường là dấu hiệu của thất bại).

+17

Cũng tốt để chỉ ra rằng '[' là một lệnh. Đó là một quan niệm sai lầm phổ biến với người dùng mới rằng '[' là một phần của cú pháp 'if' và' while'. – jordanm

+1

Làm thế nào tôi có thể nhận được số lần nó chạy trước khi nó thất bại? – GrantJ

+0

@GrantJ: Có vẻ như sẽ dễ dàng hơn khi viết một tập lệnh python để thêm những thứ như thế. –

5

Nếu bạn không muốn quấn một đường ống phức tạp thành một kịch bản shell hoặc chức năng sau đó làm việc này:

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

Yêu cầu HTTP trong trường hợp này luôn trả về 200 nhưng cũng trả về một số JSON trong đó có một thuộc tính "HasErrors": đúng khi có lỗi.

Các vấn đề liên quan