Tôi muốn các kịch bản shell của tôi thất bại bất cứ khi nào một lệnh được thực thi với chúng thất bại.
Thông thường tôi làm điều đó với:
set -e
set -o pipefail
(thông thường tôi set -u
cũng thêm )
Điều này là không có cái nào ở trên hoạt động với sự thay thế quá trình. Mã này in "ok" và thoát với mã trả về = 0, trong khi tôi muốn nó thất bại:
#!/bin/bash -e
set -o pipefail
cat <(false) <(echo ok)
Có bất cứ điều gì tương đương với "pipefail" nhưng để thay thế quá trình? Bất kỳ cách nào khác để chuyển đến một lệnh đầu ra của các lệnh vì chúng là các tệp, nhưng gây ra lỗi bất cứ khi nào bất kỳ chương trình nào trong số đó không thành công?
Một giải pháp cho người nghèo sẽ được phát hiện nếu những lệnh đó ghi vào stderr (nhưng một số lệnh ghi vào stderr trong các tình huống thành công).
Một giải pháp tương thích posix khác sẽ sử dụng các ống có tên, nhưng tôi cần phải sử dụng các lệnh thay thế quy trình sử dụng đó như các onelin được xây dựng từ mã được biên dịch và tạo các ống có tên sẽ làm phức tạp mọi thứ (lệnh thêm, lỗi bẫy xóa chúng, v.v.)
$$
thay thế không hoạt động đối với tôi, vì việc thay thế lệnh không được thực hiện vì lệnh sử dụng thay thế quy trình được thực hiện bên trong một đường ống lệnh được sinh ra từ mã "không vỏ" (python). Có lẽ tôi nên tạo quy trình con trong python và dẫn chúng theo chương trình.
kill -2 0
.
mkfifo pipe; { rm pipe; cat <file; } >pipe
. Lệnh đó sẽ bị treo cho đến khi một trình đọc mở rapipe
bởi vì nó là trình bao,open()
và ngay sau khi có một trình đọc trênpipe
liên kết fspipe
làrm
'd và sau đócat
sao chép vào phần mô tả của trình bao cho đường ống đó. Và dù sao đi nữa, nếu bạn muốn tuyên truyền một lỗi ra khỏi một quy trình phụ, hãy thực hiện: <( ! : || kill -2 "$$")