Saya ingin skrip shell saya gagal setiap kali perintah dieksekusi dengan mereka gagal.
Biasanya saya melakukannya dengan:
set -e
set -o pipefail
(biasanya saya tambahkan set -u
juga)
Masalahnya adalah bahwa tidak ada yang di atas bekerja dengan substitusi proses. Kode ini mencetak "ok" dan keluar dengan kode pengembalian = 0, sementara saya ingin gagal:
#!/bin/bash -e
set -o pipefail
cat <(false) <(echo ok)
Apakah ada yang setara dengan "pipefail" tetapi untuk substitusi proses? Adakah cara lain untuk meneruskan ke perintah output dari perintah seperti itu adalah file, tetapi meningkatkan kesalahan setiap kali salah satu program gagal?
Solusi orang miskin akan mendeteksi jika perintah-perintah itu menulis ke stderr (tetapi beberapa perintah menulis ke stderr dalam skenario sukses).
Solusi lain yang lebih sesuai dengan posix adalah menggunakan pipa bernama, tapi saya perlu menjalankan perintah-perintah-yang-menggunakan-proses sebagai oneliners yang dibangun dengan cepat dari kode yang dikompilasi, dan membuat pipa bernama akan mempersulit hal-hal (perintah tambahan, menjebak kesalahan untuk menghapusnya, dll.)
$$
substitusi tidak berfungsi untuk saya, karena substitusi perintah tidak dilakukan karena perintah yang menggunakan proses substitusi dilakukan di dalam pipeline perintah yang dihasilkan dari kode "non shell" (python). Mungkin saya harus membuat subproses dengan python dan mengirimkannya secara terprogram.
kill -2 0
.
mkfifo pipe; { rm pipe; cat <file; } >pipe
. Perintah itu akan digantung sampai pembaca membukapipe
karena itu adalah shell yang melakukanopen()
dan begitu begitu ada pembaca padapipe
tautan fs untukpipe
isrm
'd dan kemudiancat
salinan infile keluar ke deskriptor shell untuk pipa itu.: <( ! : || kill -2 "$$")