Saya ingin menyederhanakan output skrip dengan menekan output dari perintah sekunder yang biasanya berhasil.
Namun, menggunakan -q
mereka menyembunyikan output ketika mereka kadang-kadang gagal, jadi saya tidak punya cara untuk memahami kesalahan. Selain itu, perintah ini mencatat outputnya stderr
.
Apakah ada cara untuk menekan output perintah hanya jika berhasil ?
Misalnya (tetapi tidak terbatas pada) sesuatu seperti ini:
mycommand | fingerscrossed
Jika semuanya berjalan dengan baik, fingerscrossed
tangkap hasilnya dan buang. Jika tidak, gema ke standar atau output kesalahan (apa pun).
scripting
error-handling
Matthieu Napoli
sumber
sumber
moreutils
. Baik untuk saya, tetap :)Itu mungkin harus melakukan trik. Ini akan buffer output masing-masing
command
ke dalam file sementara yang dihapus, dan kemudian menyedot outputnya ke salah satu/dev/null
atau stderr tergantung pada apakah atau tidaknya status pengembaliannya tidak nol. Karena file temp dihapus sebelumnya tidak dapat dibaca oleh proses apa pun kecuali shell saat ini dan anak-anaknya di deskriptor file-nya (kecuali/proc/$pid/fd
snoop licik dengan izin yang sesuai) , dan tidak perlu dibersihkan saat Anda selesai.Mungkin solusi yang lebih nyaman pada sistem linux:
... yang, di sebagian besar kerang, bekerja seperti yang lain, kecuali bahwa Anda dapat menyebutnya seperti:
divert some simple-command with args
. Waspadalah terhadap perintah output tinggi di"$@"
, meskipun untukdash
,,yash
atau beberapa shell lain yang dilakukan di sini-dokumen dengan pipa - Saya pikir itu mungkin dalam shell untuk mengisi buffer pipa (pada default sekitar 128kb di linux) dan kebuntuan . Itu seharusnya tidak menjadi khawatir untukksh
,mksh
,bash
,zsh
, atau Bourne shell, meskipun - semua orang pada dasarnya melakukan hal yang sama seperti yang saya lakukan secara eksplisit di atas denganexec
.sumber
Biasanya jika terjadi kesalahan, perintah menampilkan pesan
stderr
sehingga untuk tugas Anda, Anda bisa menekanstdout
sumber
stderr
(jadi tidak berpengaruh).Untuk membuat Anda sendiri kronis
sumber
Saya melakukan sesuatu seperti ini di makefiles saya:
Menyesuaikan itu dengan situasi Anda, Anda bisa melakukan sesuatu seperti ini:
Jadi, "jika" menjalankan perintah dan menyalurkan output ke mycommand.log. Jika Anda perlu menangkap stdout vs stdout vs apa pun, Anda mungkin perlu mengubah perintah pipa '&>' ke '>'. Jika perintah gagal maka tangkap kode kesalahan, cetak konten mycommand.log, hapus mycommand.log, dan akhirnya kembali dengan kode kesalahan asli.
Tanpa (keluar $ c) Anda akan kembali dengan kode keluar yang cocok dengan apa yang dikembalikan oleh perintah 'rm'.
Akhirnya, jika Anda ingin liner satu, sesuatu seperti ini akan berhasil.
sumber
(...)
seperti itu? Karena itu tidak melakukan apa pun yang berguna untuk Anda tetapi menelurkan sub-shell ekstra.(exit $c)
sedang mengatur$?
, sesuatu yang tidak bisa Anda lakukan sebaliknya.if ! (mycommand) &>x
berarti dengan pengalihan jika perintah menggunakan egtime
atau akan memberikan kesalahan shell.{ ; }
ikal ... meskipunexit
ada sedikit rumit, harus diakui.$?
maka Anda bisa menggunakanexit $c
tetapi ya, dalam kasus lain(exit $?)
memiliki nilai (meskipun fungsi shellrret() { return $1; }
akan lebih baik secara umum saya berpendapat). Subshell untuk perintah masih tidak benar-benar seperti yang ditunjukkan mikeserv.Saya baru saja menemukan jawaban yang jauh lebih sederhana pada pertanyaan lain ini :
Bekerja seperti pesona!
sumber