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 command1
thấ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 pipefail
nó 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 set
và 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/sh
mà 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/bash
thay 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/sh
thành một liên kết đến hoặc sao chép, /bin/bash
thay 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/sh
là bash
, thì bạn đang sử dụng hành vi bash
không phơi bày khi chạy như /bin/sh
; sử dụng bash
như bash
.
/bin/sh
không thíchset -o pipefail
. Là nó thực sựbash
ngụ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
?