Dari baris perintah Bash Anda perlu menjalankan subkulit untuk menghindari pipefail
disetel setelahnya:
$ (set -o pipefail && command1 | command2 | command3)
Ini akan membatasi efek dari pipefail
opsi untuk membuat subkulit dengan tanda kurung (...)
.
Contoh nyata:
$ (set -o pipefail && false | true) && echo pipefail inactive || echo pipefail active
pipefail active
Jika Anda menggunakan panggilan shell eksplisit dengan -c
opsi Anda tidak memerlukan subkulit, baik dengan bash
atau dengan sh
alias ke bash
:
$ bash -c "set -o pipefail && false | true" && echo pipefail inactive || echo pipefail active
pipefail active
$ sh -c "set -o pipefail && false | true" && echo pipefail inactive || echo pipefail active
pipefail active
Sejak sh
Anda tidak menerima pipefail
opsi, saya harus berasumsi bahwa itu adalah versi bash
yang lebih lama atau dimodifikasi - atau sebenarnya itu adalah shell lain sepenuhnya.
Tidak yakin mengapa itu tidak disebutkan di atas, tetapi dimungkinkan untuk menghapus pipefail
secara eksplisit , menggunakan set +o pipefail
.
set -o pipefail
command1 | command2 | command3
set +o pipefail
Jika Anda mengeksekusi sebuah fragmen, dan tidak yakin tentang pipefail
sudah disetel, Anda dapat menggunakan ini dengan subkulit seperti yang disarankan sebelumnya:
# explicitly execute with pipefail set
(set -o pipefail ; command1 | command2 | command3 )
# explicitly execute with pipefail unset
(set +o pipefail ; command1 | command2 | command3 )