Bỏ đầu ra trừ khi mã thoát khác không


19

Cách tốt nhất để triệt tiêu đầu ra (stdout và stderr) trừ khi chương trình thoát với mã khác không? Tôi đang nghĩ:

quiet_success()
{
  file=$(mktemp)
  if ! "$@" > "$file" 2>&1; then
    cat "$file"
  fi
  rm -f "$file"
}

Và chạy quiet_success my_long_noisy_script.shnhưng tôi không chắc có cách nào tốt hơn không. Tôi cảm thấy như đây là điều mà người khác cần phải làm.

Đối với ngữ cảnh, tôi đang tìm cách thêm phần này vào tập lệnh cron của mình để tôi được gửi email với mọi thứ nếu chúng thất bại, nhưng không phải nếu chúng không có.


Đây phải là hành vi mặc định của hầu hết các lệnh (không có đầu ra khi thành công). Nếu không, điều đầu tiên cần làm là tìm kiếm một tùy chọn / chuyển đổi để kích hoạt hành vi đó. Không, cách tiếp cận của bạn là ý tưởng đúng. Lưu ý bên lề: Tôi giả sử bạn đã đăng mã giả vì đây không phải là shcú pháp thực sự hợp lệ và thứ tự chuyển hướng của bạn bị ngược (làm > "$file" 2>&1và sử dụng nhiều trích dẫn hơn).
jw013

Đúng, tôi vừa gõ nó vào câu hỏi. Áp dụng đề xuất của bạn và tôi đồng ý, lệnh phải chịu trách nhiệm cho việc đó, nhưng than ôi ...
dimo414

Chỉ cần một lưu ý cú pháp: không cần dấu ngoặc đơn xung quanh lệnh.
manatwork

Câu trả lời:


14

Bạn sẽ phải đệm đầu ra ở đâu đó bất kể là gì, vì bạn cần đợi mã thoát để biết phải làm gì. Một cái gì đó như thế này có lẽ là dễ nhất:

$ output=`my_long_noisy_script.sh 2>&1` || echo $output

Lưu ý rằng nếu bạn sử dụng set -o xtracetrong tập lệnh shell của mình thì tất cả đầu ra sẽ lại ở đó như là một phần của việc ghi nhật ký các chi tiết của bài tập output=...:-). Trong trường hợp đó có lẽ tốt hơn để sử dụng chronic.
Jan-Philip Gehrcke

11

Các moreutilsgói chứa một chương trình chroniccho mục đích này. Bạn chỉ cần gọi nó như

chronic my_program args ...

Rất tiện dụng trong công việc định kỳ.


3
Đừng như tôi và sai lầm chroniccho cronic, mà là một chương trình tương tự mà hồi kết xuất trừ khi một lệnh tồn tại với một mã số khác không hoặc tạo ra sai số chuẩn .
Witiko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.