Bash nắm bắt bất kỳ lỗi nào như -e nhưng không thoát, làm gì khác


8

Tôi muốn đặt cờ trong tập lệnh shell (bash) để nếu mọi thứ trả về giá trị khác không, một cờ được đặt (nghĩa là đặt một biến như errors="True").

Cho đến nay, tôi đã nghĩ đến việc gọi kịch bản với scriptname.sh 2>Error.logvà sau đó làm một cái gì đó như:

 if $(wc -l error.log) != 0; then
   errors="True"

Phải có một cách tốt hơn nhiều. Vui lòng làm sáng tỏ cho tôi.

Câu trả lời:


6

Đây là chính xác những gì trap ERRlà cho. Thật không may, nó có những hạn chế và nhược điểm tương tự như set -e. Giống như set -e, bất kỳ lệnh nào trả về giá trị khác không trong biểu thức điều kiện sẽ kích hoạt bẫy. Dưới đây là một số mã ví dụ:

error=0
set_error() {
    (( error++ )) 
}

trap set_error ERR
ls askdjasdaj 2>/dev/null
false
false || true # false returns non-zero but is not counted due to the conditional
echo "$error" # outputs "2"

Cảm ơn! Bẫy có hoạt động đối với bất kỳ lỗi nào bị bắt bên dưới dòng bẫy không? bẫy -l liệt kê các tín hiệu tiêu chuẩn, tôi không thấy ERR nhưng ERR dường như hoạt động. ERR được coi là gì? Nó là một tín hiệu, hay nó là tốc ký cho bộ mô tả tập tin?
Gregg Leventhal

@GreggLeventhal - không phải vậy, nó rất đặc biệt đối với bash. Có nhiều chi tiết hơn trong phần "bẫy" của trang bash.
jordanm

Xin lỗi, tôi chỉ đọc nó (hoặc đã bắt đầu đọc nó). Tôi hơi bối rối vì errtrace không được đặt trong vỏ của tôi, tôi nghĩ rằng tôi thấy rằng nó cần phải được đặt để từ khóa ERR hoạt động với bẫy, nhưng tôi có thể đã đọc sai điều đó.
Gregg Leventhal
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.