Beranda » bagaimana » Bagaimana Anda menjalankan perintah di latar belakang tanpa hasil kecuali jika ada kesalahan?

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

    Jika Anda adalah orang yang sibuk, maka hal terakhir yang Anda butuhkan adalah diganggu dengan notifikasi 'tidak berguna' yang sangat banyak, jadi bagaimana Anda menenangkannya? Posting Q&A SuperUser hari ini memiliki beberapa jawaban bagus untuk membantu pembaca mengurangi jumlah output.

    Sesi Tanya Jawab hari ini datang kepada kami berkat SuperUser-subdivisi Stack Exchange, pengelompokan situs web Q&A berbasis komunitas.

    Pertanyaan

    SuperUser reader Xster ingin tahu cara menjalankan perintah di latar belakang tanpa output kecuali ada kesalahan:

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

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

    Jawabannya

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

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

    Beberapa perintah akan memberikan bendera (yaitu. -diam atau -diam) untuk menekan output non-kesalahan. Baca halaman manual 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 kode keluar lainnya menunjukkan kesalahan.

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

    Anda juga dapat menggunakan beberapa cara pintas jika Anda tidak chaining perintah:

    Atau:

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

    (catatan: Saya sebenarnya tidak tahu ikan, jadi saya mengadaptasi konsep tersebut dengan apa yang dapat saya temukan dalam dokumentasinya. Sintaksnya mungkin sedikit salah. Anda juga bisa menggunakannya mktemp untuk menghasilkan file sementara yang unik. Jalankan dan rekam 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 keluaran-bersembunyi dan menjalankan skrip di latar belakang dengan teknik standar (ikan). Heck, Anda dapat memasukkan sesuatu seperti fungsi berikut ini ~ / .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 dalam hal terjadi kegagalan. Anda dapat menyesuaikannya sesuai kebutuhan.

    (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 dikontrol oleh program dan beberapa akan menunjukkan beberapa kondisi sukses dengan keluar tidak nol. Sekali lagi, periksa manualnya.

    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 sudah cukup untuk menekan stdout jadi itu saja stderr mendapat output ke konsol.

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

    Jadi misalnya:

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

    Perintah mannotnotexist> / dev / null mencetak pesan kesalahan, karena pria menulis pesan kesalahannya ke stderr.


    Punya sesuatu untuk ditambahkan ke penjelasan? Berbunyi dalam komentar. Ingin membaca lebih banyak jawaban dari pengguna Stack Exchange yang mengerti teknologi lainnya? Lihat utas diskusi lengkap di sini.