Saya memiliki skrip yang mem-parsing nama file ke dalam array menggunakan metode berikut yang diambil dari T&J di SO :
unset ARGS
ARGID="1"
while IFS= read -r -d $'\0' FILE; do
ARGS[ARGID++]="$FILE"
done < <(find "$@" -type f -name '*.txt' -print0)
Ini berfungsi dengan baik dan menangani semua jenis variasi nama file dengan sempurna. Namun, kadang-kadang, saya akan mengirimkan file yang tidak ada ke skrip, misalnya:
$ findscript.sh existingfolder nonexistingfolder
find: `nonexistingfile': No such file or directory
...
Dalam keadaan normal saya akan meminta skrip mengambil kode keluar dengan sesuatu seperti RET=$?
dan menggunakannya untuk memutuskan bagaimana untuk melanjutkan. Ini sepertinya tidak bekerja dengan proses substitusi di atas.
Apa prosedur yang benar dalam kasus seperti ini? Bagaimana saya bisa mendapatkan kode pengembalian? Apakah ada cara lain yang lebih cocok untuk menentukan apakah ada yang salah dalam proses pengganti?
sumber
Gunakan coprocess . Menggunakan
coproc
builtin Anda dapat memulai subproses, membaca outputnya dan memeriksa status keluarnya:Jika direktori tidak ada,
wait
akan keluar dengan kode status bukan nol.Saat ini perlu untuk menyalin PID ke variabel lain karena
$LS_PID
akan tidak disetel sebelumwait
dipanggil. Lihat Bash unsets * _PID variabel sebelum saya bisa menunggu di coproc untuk detailnya.sumber
read -u
harus bekerja dengan baik. Contoh itu dimaksudkan untuk menjadi generik dan menunjukkan bagaimana output dari proses dapat disalurkan ke perintah lain.Salah satu pendekatan adalah:
Idenya adalah untuk menggemakan status keluar bersama dengan token acak setelah perintah selesai, dan kemudian menggunakan bash regular expressions untuk mencari dan mengekstrak status keluar. Token digunakan untuk membuat string unik untuk dicari di output.
Ini mungkin bukan cara terbaik untuk melakukannya dalam pengertian pemrograman umum, tetapi mungkin itu cara yang paling tidak menyakitkan untuk menanganinya dalam bash.
sumber