If-Koubou

Bagaimana Anda menjalankan perintah di latar belakang tanpa Output kecuali ada kesalahan?

Bagaimana Anda menjalankan perintah di latar belakang tanpa Output kecuali ada kesalahan? (Bagaimana caranya)

Jika Anda adalah orang yang sibuk, maka hal terakhir yang Anda butuhkan adalah terganggu dengan sejumlah besar notifikasi yang 'tidak berguna', jadi bagaimana Anda menenangkan semuanya? Posting SuperUser Q & A saat ini memiliki beberapa jawaban yang bagus untuk membantu pembaca mengurangi jumlah output.

Sesi Tanya & Jawab hari ini hadir untuk memberi kami hak milik SuperUser-sub divisi Stack Exchange, pengelompokan situs web Q & A berbasis komunitas.

Pertanyaan

Pembaca SuperUser Xster ingin tahu cara menjalankan perintah di latar belakang tanpa keluaran kecuali ada kesalahan:

Bagaimana Anda menekan output perintah, tetapi menunjukkannya jika perintah keluar kode kesalahan?

Bagaimana Anda mendapatkan perintah untuk berjalan di latar belakang tanpa keluaran kecuali ada kesalahan?

Jawabannya

Kontributor SuperUser, Bob, dan Maximillian Laumeister memiliki jawabannya untuk kami. Pertama, Bob:

Sayangnya, anggapan itu stderr hanya digunakan untuk output kesalahan tidak selalu benar. Agak, stderr sering digunakan untuk setiap dan semua keluaran interaktif dan diagnostik (yaitu output yang ditujukan bagi pengguna untuk membaca dalam prompt interaktif).(1) wget dan DD adalah contoh yang terkenal.

Beberapa perintah akan menyediakan sebuah bendera (mis. -diam atau -diam) untuk menekan output non-kesalahan. Baca halaman man mereka untuk melihat apakah ada.

Konvensi lain yang lebih sering diadakan adalah kode keluar, sebuah program mengembalikan kode keluar ketika keluar. Khas(2), kode keluar dari 0 menunjukkan keberhasilan, dan semua kode keluar lainnya menunjukkan kesalahan.

Dengan pesta, Anda bisa mendapatkan kode keluar dari perintah terakhir dari $? variabel. Di ikan, menggunakan $ status variabel. Anda bisa melakukan pipe stderr ke file sementara dan hanya mencetaknya jika terjadi kesalahan. Sebagai contoh (ikan):

Anda juga dapat menggunakan beberapa pintasan jika Anda tidak merantai perintah:

Atau:

Anda juga bisa melakukan pipe stdout ke buffer yang sama dengan menggunakan 2> & 1> / tmp / outputbuffer.

(catatan: Saya sebenarnya tidak tahu ikan, jadi saya mengadaptasikan konsep ini dengan apa yang dapat saya temukan dalam dokumentasinya. Sintaksnya mungkin sedikit salah. Juga, Anda bisa menggunakannya mktemp untuk menghasilkan file sementara yang unik. Jalankan dan catat nama file dalam sebuah variabel.)

Jika Anda perlu menjalankan semuanya di latar belakang shell yang juga Anda gunakan secara interaktif pada saat yang sama, maka Anda lebih baik menulis skrip untuk menangani penyembunyian output dan menjalankan skrip tersebut di latar belakang dengan teknik standar (ikan). Heck, Anda bisa meletakkan sesuatu seperti fungsi berikut di ~ / .config / fish / config.fish:

Telepon dengan run-silent somecommand & (di mana trailing & menyebabkannya berjalan di latar belakang)

Perhatikan bahwa ini akan menelan kode keluar asli, dan akan membuang keduanya stdout dan stderr jika terjadi kegagalan. Anda dapat menyesuaikannya seperlunya.

(1) Tidak ada jaminan bahwa output kesalahan tidak akan muncul stdout, beberapa program akan membuang semua output di sana!

(2) Sayangnya, ini masih tidak selalu terjadi. Kode keluar sepenuhnya dikendalikan oleh program dan beberapa akan menunjukkan beberapa kondisi keberhasilan dengan keluar non-nol. Sekali lagi, periksa manual.

Diikuti oleh jawaban dari Maximillian Laumeister:

Utilitas Unix mengirim pesan umum ke stdout, dan pesan kesalahan ke stderr, jadi jika kita hanya ingin melihat pesan kesalahan, maka itu akan cukup untuk menekan stdout hanya itu saja stderr mendapat output ke konsol.

Cara melakukan ini (di keduanya pesta dan ikan) adalah menambahkan > / dev / null ke perintah. Pipa ini stdout ke dalam kehampaan, tapi stderr (dengan pesan kesalahan Anda) masih masuk ke konsol.

Jadi misalnya:

Perintah echo 1> / dev / null mencetak apa-apa, karena normal stdout output ditekan, dan tidak ada yang ditulis stderr.

Perintah pria doesnotexist> / dev / null mencetak pesan kesalahan, karena pria tulis pesan kesalahannya ke stderr.

Memiliki sesuatu untuk ditambahkan ke penjelasan? Bicaralah di komentar. Ingin membaca lebih banyak jawaban dari pengguna Stack Exchange yang paham teknologi lainnya? Lihat diskusi lengkap di sini.