Bagaimana Anda Menjalankan Perintah di Latar Belakang dengan Tiada Output Kecuali Terdapat Kesalahan?
Jika anda seorang yang sibuk, maka perkara terakhir yang anda perlukan adalah diganggu dengan sejumlah besar 'nota' yang tidak berguna, jadi bagaimana anda memperlahankan sesuatu? Posisi Q & A SuperUser hari ini mempunyai beberapa jawapan yang hebat untuk membantu pembaca menenangkan jumlah output.
Sesi Soalan & Jawapan hari ini datang kepada kami dengan ihsan SuperUser-bahagian pembahagian Stack Exchange, kumpulan yang diketuai oleh komuniti laman web Q & A.
Soalan
Pembaca Superuser Xster ingin tahu bagaimana untuk menjalankan arahan di latar belakang dengan tiada output melainkan terdapat ralat:
Bagaimanakah anda menindih output arahan, tetapi tunjukkan jika kod keluar perintah itu ralat?
Bagaimanakah anda mendapat arahan untuk berjalan di latar belakang dengan tiada keluaran kecuali terdapat ralat?
Jawapan
Penyumbang SuperUser Bob dan Maximillian Laumeister mempunyai jawapan untuk kami. Pertama, Bob:
Malangnya, andaian itu stderr hanya digunakan untuk output ralat tidak selalu betul. Sebaliknya, stderr sering digunakan untuk apa-apa dan semua output dan diagnostik interaktif (iaitu output yang dimaksudkan untuk pengguna untuk membaca dengan cepat interaktif).(1) wget dan dd adalah contoh yang terkenal.
Sesetengah arahan akan menyediakan bendera (iaitu. -senyap atau -senyap) untuk menekan output bukan kesilapan. Baca halaman lelaki mereka untuk melihat apakah ada.
Satu lagi konvensyen yang sering diadakan ialah kod keluar, program mengembalikan kod keluar apabila keluar. Biasanya(2), kod keluar dari 0 menunjukkan kejayaan, dan mana-mana kod keluar lain menunjukkan kesilapan.
Dengan bash, anda boleh mendapatkan kod keluar arahan terakhir dari $? pembolehubah. In ikan, menggunakan status $ pembolehubah. Anda boleh paip stderr ke fail sementara dan cetak hanya jika ralat berlaku. Sebagai contoh (ikan):
Anda juga boleh menggunakan beberapa jalan pintas jika anda tidak memerintahkan arahan:
Atau:
Anda juga boleh paip stdout kepada penampan yang sama dengan menggunakan 2> & 1> / tmp / outputbuffer.
(Catatan: Saya tidak tahu ikan, jadi saya menyesuaikan konsep dengan apa yang saya dapati dalam dokumentasinya. Sintaks mungkin sedikit salah. Juga, anda boleh menggunakannya mktemp untuk menjana fail sementara yang unik. Jalankan dan rekod nama fail dalam pemboleh ubah.)
Sekiranya anda perlu menjalankan semua perkara di latar belakang shell yang anda gunakan secara interaktif pada masa yang sama, maka anda lebih baik menulis skrip untuk mengendalikan output yang bersembunyi dan menjalankan skrip itu di latar belakang dengan teknik standard (ikan). Heck, anda boleh meletakkan sesuatu seperti fungsi berikut di ~ / .config / fish / config.fish:
Panggil dengan berjalan-senyap somecommand & (di mana trailing & menyebabkannya berjalan di latar belakang)
Perhatikan bahawa ini akan menelan kod keluar asal, dan akan membuang kedua-duanya stdout dan stderr sekiranya berlaku kegagalan. Anda boleh menyesuaikannya seperti yang diperlukan.
(1) Tidak ada jaminan bahawa output ralat tidak akan muncul stdout, sesetengah program akan membuang semua output di sana!
(2) Malangnya, ini masih tidak selalu berlaku. Kod keluar sepenuhnya dikawal oleh program dan ada yang akan menunjukkan beberapa keadaan kejayaan dengan keluar tanpa sifar. Sekali lagi, semak manual.
Diikuti dengan jawapan dari Maximillian Laumeister:
Utiliti Unix menghantar mesej umum kepada stdout, dan mesej ralat kepada stderr, jadi jika kita hanya mahu melihat mesej ralat, maka ia akan mencukupi untuk menindas stdout supaya hanya stderr mendapat output ke konsol.
Cara untuk melakukan ini (kedua-duanya bash dan ikan) adalah untuk menambah > / dev / null kepada perintah itu. Paip ini stdout ke dalam ketiadaan, tetapi stderr (dengan mesej ralat anda) masih sampai ke konsol.
Jadi misalnya:
Perintah itu echo 1> / dev / null tidak mencetak apa-apa, kerana biasa stdout output ditindas, dan tiada apa yang ditulis stderr.
Perintah itu man doesnotexist> / dev / null mencetak mesej ralat, kerana lelaki menulis mesej ralat kepada stderr.
Mempunyai sesuatu untuk menambah penjelasannya? Bunyi dalam komen. Ingin membaca lebih banyak jawapan dari pengguna Stack Exchange yang berteknologi tinggi? Lihat thread perbincangan penuh di sini.