2011-02-06 34 views
7

Tôi đã có một kịch bản thử nghiệm chạy một ứng dụng nhỏ hơn và hơn nữa với các đầu vào khác nhau:Ngăn chặn bash từ in thông điệp “<PID> Aborted”

# test_script.sh 

for input1 in $some_range; do 
    for input2 in $some_other_range; do 
     if ! ./my_app $input1 $input2 2>/dev/null; then 
      echo "ERROR: app failed with inputs: $input1 $input2" 
     fi 
    done 
done 

này là tất cả tốt và tốt, trừ khi nó không thành công tôi nhận được hai thông điệp, các 'LỖI' thông điệp mà tôi muốn, và sau đó khác (rõ ràng từ bash?) cảnh báo với tôi rằng ứng dụng của tôi đã bị hủy bỏ:

test_script.sh: line 10: 641 Aborted   ./my_app $input1 $input2 
ERROR: app failed with inputs: XXX YYY 

làm thế nào để ngăn chặn những thông điệp 'đã hủy bỏ'?

Cũng lưu ý: Ứng dụng có thể không thành công trên tuyên bố 'khẳng định' của thư viện C chuẩn.

+0

Điều này không giải quyết được câu hỏi của bạn, nhưng thông báo lỗi nên chuyển sang stderr, do đó, tiếng vọng của bạn nên được chuyển hướng. ví dụ. 'echo' ERROR ... "> & 2 ' –

Trả lời

0

bạn có thể chuyển hướng stderr để /dev/null

./myapp .... 2>/dev/null

+0

Tôi đã chuyển hướng lệnh của lệnh vào/dev/null; Tôi sẽ cập nhật câu hỏi. Thông báo dường như đến từ bash, không phải ứng dụng, vì nó chỉ định số dòng của quy trình bị hủy. – aaronstacy

1

Hãy thử tắt điều khiển công việc:

set +m 
+0

Dường như không giúp được gì. – FeepingCreature

0

Bạn có lẽ không nên ngăn chặn các thông báo lỗi. Thay vì có kịch bản của bạn phát ra một thông báo lỗi và ngăn chặn các lỗi từ các ứng dụng, có kịch bản nói gì và để cho thông báo lỗi của ứng dụng in. Nếu bạn không thích thông báo lỗi từ ứng dụng, hãy sửa nó trong ứng dụng thay vì cố gắng để có kịch bản vá nó.

0

Bạn có thể sử dụng $() quấn lệnh của bạn, ví dụ:

$($app &> /dev/n 
+2

Câu trả lời của bạn có thể cần hoàn thành không? – Ryan

4

Tôi chỉ chạy vào này quá. Dường như bản thân số bash in đơn phương này nếu một tiến trình con trả về với mã trạng thái 134, cho biết đứa trẻ đã nhận được SIGABRT. Giải pháp là chạy tiến trình con trong một vỏ bọc con, sau đó đảm bảo mã con trả về mã trạng thái khác (vẫn không khác) về lỗi và có đầu ra của nó được chuyển hướng đến /dev/null. Ví dụ:

if ! (./myapp || false) >/dev/null 2>&1; then 
    ... 
fi 
Các vấn đề liên quan