Saya perlu menjalankan sejumlah perintah shell yang disalurkan dari skrip non-BASH (yaitu skrip PHP) seperti ini:
command1 | command2 | command3
sehingga, jika command1
gagal dengan kode keluar bukan nol, setiap perintah lainnya juga gagal. Sejauh ini, yang saya pikirkan adalah:
set -o pipefail && command1 | command2 | command3
Tetapi meskipun berjalan dengan baik dari terminal, ia menghasilkan ini jika dieksekusi dari skrip:
sh: 1: set: Opsi ilegal -o pipefail
/bin/sh set -o pipefail
mengatakan /bin/sh: 0: Can't open set
(hal yang sama dengan sudo
). Semoga saya mengujinya dengan benar. Sistemnya adalah Ubuntu 12.
/bin/sh -c "set -o pipefail"
; seolah-olah, shell sedang mencoba untuk mengeksekusi skrip di direktori saat ini dipanggil set
dan tidak menemukannya.
/bin/sh -c "set -o pipefail"
tidak berfungsi, namun bash -c "set -o pipefail"
tidak.
/bin/sh
yang tidak dikenali set -o pipefail
. Karenanya, Anda harus memastikan bahwa skrip dijalankan oleh /bin/bash
alih-alih /bin/sh
. Atau, jika Anda percaya diri, berani - dan mungkin bodoh - ubah /bin/sh
menjadi tautan, atau salinan, /bin/bash
alih-alih shell mana pun yang saat ini ditautkan atau salinannya. Jika Anda sedang yakin bahwa /bin/sh
adalah bash
, maka Anda menggunakan perilaku yang bash
tidak mengekspos ketika dijalankan sebagai /bin/sh
; gunakan bash
sebagai bash
.
/bin/sh
tidak sukaset -o pipefail
. Apakah itu sebenarnyabash
dalam penyamaran, atau apakah itu shell yang berbeda? Kapanbash
dijalankan sebagai/bin/sh
, apakah ia menerimaset -o pipefail
?