Saya perlu menjalankan sejumlah perintah shell yang disalurkan dari skrip non-BASH (yaitu skrip PHP) seperti ini:
command1 | command2 | command3
sehingga, jika command1gagal 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 pipefailmengatakan /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 setdan tidak menemukannya.
/bin/sh -c "set -o pipefail"tidak berfungsi, namun bash -c "set -o pipefail"tidak.
/bin/shyang tidak dikenali set -o pipefail. Karenanya, Anda harus memastikan bahwa skrip dijalankan oleh /bin/bashalih-alih /bin/sh. Atau, jika Anda percaya diri, berani - dan mungkin bodoh - ubah /bin/shmenjadi tautan, atau salinan, /bin/bashalih-alih shell mana pun yang saat ini ditautkan atau salinannya. Jika Anda sedang yakin bahwa /bin/shadalah bash, maka Anda menggunakan perilaku yang bashtidak mengekspos ketika dijalankan sebagai /bin/sh; gunakan bashsebagai bash.
/bin/shtidak sukaset -o pipefail. Apakah itu sebenarnyabashdalam penyamaran, atau apakah itu shell yang berbeda? Kapanbashdijalankan sebagai/bin/sh, apakah ia menerimaset -o pipefail?