Điểm:5

Làm cách nào để kiểm tra xem lệnh có bị lỗi không... bằng một đường ống?

lá cờ cn

Vì vậy, tôi có một kịch bản như thế này:

một số người | grep --invert-match một cái gì đó

Tôi muốn có thể chạy một cách có điều kiện một lệnh khác nếu mệnh lệnh nào đó thất bại. Đây là những gì tôi đã thử:

lệnh nào đó | grep --invert-match something || {
    tiếng vang 'Rất tiếc'
}

Nhưng điều đó đã không làm việc (các tiếng kêu không được thực hiện). cách thích hợp để làm điều này là gì?

lá cờ hr
Có lẽ bạn có thể sử dụng mảng `PIPESTATUS` của bash: xem ví dụ [Nhận trạng thái thoát của quy trình được chuyển sang quy trình khác](https://unix.stackexchange.com/a/14276/65304)
lá cờ be
Khi bạn sử dụng một đường dẫn, `grep` bắt đầu *trước* bạn nhất thiết có thể biết liệu `somecommand` có bị lỗi hay không. Bạn có muốn đầu ra của lệnh khác chuyển đến `grep` không? `{ lệnh nào đó || { tiếng vang Rất tiếc; }; } | kêu...`.
Điểm:10
lá cờ cn

@steeldriver đề cập trong các ý kiến điều đó PIPESTATUS có thể làm việc. Tôi đã thử nó, và nó hoạt động tốt. Đây là những gì tôi đã làm:

lệnh nào đó | grep --invert-match một cái gì đó
nếu [ "${PIPESTATUS[0]}" != "0" ]; sau đó
    tiếng vang 'Rất tiếc'
fi

Nó chạy lệnh như trước, nhưng sau đó tôi có một nếu tuyên bố để xem xét PIPESTATUS mảng. Tôi chỉ quan tâm đến yếu tố đầu tiên, vì vậy đó là yếu tố tôi xem xét. Tôi kiểm tra nó không thành công (nếu mã thoát không phải là 0), và nó không thành công, hãy chạy tiếng vang 'Rất tiếc'

lá cờ in
Tính năng này có hoạt động bất kể `set -o pipefail` không?
cocomac avatar
lá cờ cn
@PedroA Tôi không biết nó làm gì. Tuy nhiên, nếu bạn thử nó, vui lòng chỉnh sửa câu trả lời của tôi hoặc đăng câu trả lời của riêng bạn.
eckes avatar
lá cờ cn
Có, nó hoạt động với pipefail, nhưng không hoạt động với `set -e -o pipefail` vì nó sẽ không đạt được if.
Điểm:7
lá cờ us

Một cách khác, tùy thuộc vào hành vi chính xác cần thiết, là sử dụng các sự cố đường ống Tùy chọn:

Trạng thái thoát của một đường ống là trạng thái thoát của lệnh cuối cùng trong đường ống, trừ khi sự cố đường ống tùy chọn được kích hoạt (xem Bộ Được xây dựng trong). Nếu sự cố đường ống được bật, trạng thái trả về của đường ống là giá trị của lệnh cuối cùng (ngoài cùng bên phải) để thoát với trạng thái khác không hoặc bằng không nếu tất cả các lệnh thoát thành công.

Vì vậy, nếu bạn không quan tâm cái nào trong mệnh lệnh nào đó hoặc tiếng kêu không thành công, miễn là một trong số đó không thành công:

đặt -o đường ống thất bại
nếu ! lệnh nào đó | grep --invert-match một cái gì đó; sau đó
    tiếng vang 'Rất tiếc'
fi

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.