Menyembunyikan output dari perintah shell biasanya melibatkan redirect stderr dan stdout. Apakah ada fasilitas atau perintah builtin yang secara default menyembunyikan output tetapi pada kesalahan dumps semua akumulasi output? Saya ingin menjalankan ini sebagai pembungkus untuk ssh
perintah jarak jauh . Sekarang saya memiliki mereka menggunakan pengalihan tetapi saya tidak mendapatkan petunjuk tentang apa yang membuat mereka gagal, dan mereka terlalu bertele-tele.
EDIT: Pada akhirnya saya membuat template berikut berdasarkan jawaban oleh @Belmin yang saya tweak sedikit untuk mengakumulasi semua perintah sebelumnya dari skrip, gunakan pengenal proses saat ini, secara otomatis menghapus log, dan menambahkan kegagalan kesalahan merah pesan saat terjadi kesalahan. Dalam templat ini silent
pembungkus awal akan berhasil, kemudian gagal perintah ketiga karena direktori sudah ada:
#!/bin/sh
set -e
SILENT_LOG=/tmp/silent_log_$$.txt
trap "/bin/rm -f $SILENT_LOG" EXIT
function report_and_exit {
cat "${SILENT_LOG}";
echo "\033[91mError running command.\033[39m"
exit 1;
}
function silent {
$* 2>>"${SILENT_LOG}" >> "${SILENT_LOG}" || report_and_exit;
}
silent mkdir -v pepe
silent mkdir -v pepe2
silent mkdir -v pepe
silent mkdir -v pepe2
2>&1
, seperti:$* >>"${SILENT_LOG}" 2>&1" || report_and_exit
Jawaban:
Saya akan menyiapkan fungsi bash seperti ini:
Kemudian, Anda bisa menjalankan perintah:
sumber
/etc/passswd
atau beberapa file penting lainnya dan mendapatkan konten ditimpa.$* > /tmp/surpress.out 2>&1
Ini benar-benar menangkap stderr.$*
bukan yang terbaik untuk menangani input sewenang-wenang. Terutama ketika itu berisi spasi atau bendera. Paling portabel${1+"$@"}
menurut stackoverflow.com/questions/743454/…Seharusnya cukup mudah untuk menulis skrip untuk tujuan ini.
Sesuatu seperti skrip yang sama sekali belum teruji.
Di sisi lain untuk perintah saya jalankan sebagai bagian dari skrip saya biasanya menginginkan sesuatu yang lebih baik daripada hanya mencetak semua output. Saya sering membatasi apa yang saya lihat untuk yang tidak dikenal. Ini adalah skrip yang saya adaptasi dari sesuatu yang saya baca lebih dari satu dekade yang lalu.
sumber
Saya tidak berpikir ada cara yang bersih untuk melakukan ini, satu-satunya hal yang dapat saya pikirkan adalah
Menerapkan ini mungkin merupakan proyek yang menarik tetapi mungkin melampaui T&J.
sumber
akan kekurangan dengan sesuatu seperti
tehcommand &>/tmp/$$ || cat /tmp/$$
tergantung seberapa banyak kegunaan / pengetikan yang Anda inginkan / butuhkan. (misalnya menggunakannya sebagai pipa atau melewati perintah dengan argumen)
Skrip pendek @zoredache pada dasarnya adalah proto-wrapper untuk ini, yang akan memberikan lebih banyak kekuatan, menangani konkurensi, dll
sumber
Cobalah demikian:
sumber
out="$(command args...)" || echo "$out"