19Aug

Bagaimana Anda Menjalankan Perintah di Latar Belakang Tanpa Output Kecuali Ada Kesalahan?

click fraud protection

Jika Anda orang yang sibuk, maka hal terakhir yang Anda butuhkan adalah diganggu dengan sejumlah besar notifikasi 'tidak berguna', jadi bagaimana Anda menenangkan semuanya? Pos SuperUser hari ini memiliki beberapa jawaban bagus untuk membantu pembaca menenangkan jumlah output.

Pertanyaan Hari Ini &Sesi jawaban datang kepada kami atas izin SuperUser - subdivisi dari Stack Exchange, pengelompokan berbasis komunitas dari Q & A situs web.

Pertanyaan

Pembaca superuser Xster ingin tahu bagaimana menjalankan perintah di latar belakang tanpa hasil kecuali ada kesalahan:

Bagaimana Anda menekan keluaran perintah, tapi tunjukkan jika perintah keluar kode?

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

Jawaban

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

Sayangnya, asumsi bahwa stderr hanya digunakan untuk output error tidak selalu benar. Sebaliknya, stderr

instagram viewer
sering digunakan untuk setiap dan semua keluaran dan diagnostik interaktif( yaitu keluaran yang ditujukan bagi pengguna untuk dibaca secara interaktif).( 1) wget dan dd adalah contoh yang terkenal.

Beberapa perintah akan memberi tanda( yaitu -quiet atau -silent ) untuk menekan keluaran non-error. Baca halaman manual mereka untuk melihat apakah ada yang ada.

Konvensi lain yang berlaku lebih sering adalah kode keluar , sebuah program mengembalikan kode keluar saat keluar. Biasanya ( 2) , kode keluar dari 0 menunjukkan keberhasilan, dan kode keluar lainnya menunjukkan adanya kesalahan.

Dengan bash , Anda bisa mendapatkan kode keluar dari perintah terakhir dari $?Variabel Dalam ikan , gunakan $ status variabel. Anda dapat menyambung stderr ke file sementara dan hanya mencetaknya jika terjadi kesalahan. Sebagai contoh( fish ):

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

Atau:

Anda juga dapat menyambung stdout ke buffer yang sama dengan menggunakan 2 & gt; & 1 & gt;/tmp/ outputbuffer .

( Catatan: Saya tidak benar-benar tahu ikan , jadi saya menyesuaikan konsep dengan apa yang dapat saya temukan dalam dokumentasinya. Sintaksnya mungkin sedikit salah Juga, Anda dapat menggunakan mktemp untuk menghasilkan temporer yang unik.) Jalankan dan catat nama file dalam sebuah variabel.)

Jika Anda perlu menjalankan semuanya di latar belakang sebuah shell yang juga Anda gunakan secara interaktif pada saat yang bersamaan, maka Anda lebih baik menulis naskah untuk ditangani.output-bersembunyi dan menjalankan skrip di latar belakang dengan teknik standar( fish ).Heck, Anda dapat menempatkan sesuatu seperti fungsi berikut di ~ /.config/fish/ config.fish :

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

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

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

( 2) Sayangnya, hal ini masih belum selalu terjadi. Kode keluar sepenuhnya dikontrol oleh program dan beberapa akan menunjukkan beberapa kondisi keberhasilan dengan non-zero exit. 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 akan cukup untuk menekan stdout sehinggahanya stderr mendapatkan output ke konsol.

Cara untuk melakukan ini( baik bash dan fish ) adalah menambahkan & gt;/dev/ null ke perintah. Pipa ini stdout ke dalam ketiadaan, tapi stderr ( dengan pesan kesalahan Anda) masih sampai ke konsol.

Jadi misalnya:

Perintah echo 1 & gt;/dev/ null tidak mencetak apa-apa, karena stdout output yang biasa ditekan, dan tidak ada yang ditulis ke stderr .

Perintah man doesnotexist & gt;/dev/ null mencetak pesan kesalahan, karena man menulis pesan kesalahannya kepada stderr .

Punya sesuatu untuk ditambahkan ke penjelasannya? Terdengar dalam komentar. Ingin membaca lebih banyak jawaban dari pengguna Stack Exchange tech-savvy lainnya? Simak thread diskusi selengkapnya disini.