Tôi cần phải thực thi một số lệnh shell được lấy từ tập lệnh không phải BASH (cụ thể là tập lệnh PHP) như sau:
command1 | command2 | command3
do đó, nếu command1thất bại với mã thoát khác không, thì mỗi lệnh khác cũng thất bại. Cho đến nay, những gì tôi nghĩ ra là:
set -o pipefail && command1 | command2 | command3
Nhưng ngay cả khi nó chạy tốt từ thiết bị đầu cuối, nó sẽ tạo ra điều này nếu được thực thi từ tập lệnh:
sh: 1: set: Tùy chọn bất hợp pháp -o pipefail
/bin/sh set -o pipefailnó nói /bin/sh: 0: Can't open set(điều tương tự với sudo). Hy vọng tôi đã thử nó đúng. Hệ thống là Ubuntu 12.
/bin/sh -c "set -o pipefail"; vì vậy, shell đã cố gắng thực thi một tập lệnh trong thư mục hiện tại được gọi setvà nó không tìm thấy nó.
/bin/sh -c "set -o pipefail"không hoạt động, tuy nhiên, bash -c "set -o pipefail"không.
/bin/shmà không nhận ra set -o pipefail. Do đó, bạn sẽ cần đảm bảo rằng tập lệnh được chạy /bin/bashthay vì /bin/sh. Hoặc, nếu bạn tự tin, dũng cảm - và có thể là điên rồ - hãy thay đổi /bin/shthành một liên kết đến hoặc sao chép, /bin/bashthay vì bất kỳ vỏ nào hiện tại được liên kết hoặc một bản sao. Nếu bạn chắc chắn đó /bin/shlà bash, thì bạn đang sử dụng hành vi bashkhông phơi bày khi chạy như /bin/sh; sử dụng bashnhư bash.
/bin/shkhông thíchset -o pipefail. Là nó thực sựbashngụy trang, hoặc nó là một vỏ khác nhau? Khibashđược chạy như/bin/sh, nó có chấp nhậnset -o pipefail?