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 )