Bagaimana cara mengarahkan output dari suatu perintah?


14

Saya mencoba menulis skrip sederhana untuk memonitor status jaringan saya, tanpa semua pingoutput:

ping -q -c 1 google.com > /dev/null && echo online || echo offline

Masalahnya adalah ketika saya tidak terhubung, saya masih mendapatkan pesan kesalahan di output saya:

ping: unknown host google.com
offline

Bagaimana saya bisa menjaga pesan kesalahan ini keluar dari output saya?

Jawaban:


28

Ketika Anda menjalankan:

ping -q -c 1 google.com > /dev/null && echo online || echo offline

Anda pada dasarnya hanya mengarahkan output dari Stream 1 (yaitu stdout) ke /dev/null.

Ini bagus ketika Anda ingin mengarahkan output yang dihasilkan oleh eksekusi normal suatu program. Namun, jika Anda juga ingin mengarahkan ulang output yang disebabkan oleh semua kesalahan, peringatan atau kegagalan, Anda juga harus mengarahkan ulang stderratau Standard Error stream ke /dev/null.

Salah satu cara melakukan ini adalah dengan menambahkan jumlah aliran yang ingin Anda alihkan ke operator pengalihan, >seperti ini:Command 2> /dev/null

Karenanya, perintah Anda akan terlihat seperti:

ping -q -c 1 google.com > /dev/null 2> /dev/null && echo online || echo offline

Namun, perhatikan bahwa kami telah mengalihkan satu aliran ke /dev/null. Mengapa tidak hanya dukung-dukungan pada pengalihan yang sama? Bash memungkinkan kami melakukan ini dengan menentukan nomor aliran yang akan dialihkan. 2>&1.

Perhatikan &karakter setelah operator pengalihan. Ini memberitahu shell bahwa apa yang muncul berikutnya bukan nama file, tetapi pengidentifikasi untuk aliran output.

ping -q -c 1 google.com > /dev/null 2>&1  echo online || echo offline

Hati-hati dengan operator pengalihan, pesanan mereka sangat berarti. Jika Anda mengarahkan ulang dalam urutan yang salah, Anda akan berakhir dengan hasil yang tidak terduga.

Cara lain di mana Anda dapat mencapai keheningan total adalah dengan mengarahkan ulang semua aliran keluaran untuk /dev/nullmenggunakan pintasan ini: &>/dev/null(atau redirect ke file log dengan &>/path/to/file.log).

Maka, tulis perintah Anda sebagai:

ping -q -c 1 google.com &> /dev/null && echo online || echo offline

1
Aha &>/dev/nullitu. Terima kasih atas bantuan seketika!
Operalala

4
Be careful with the redirection operators, their order matters a lot., tetapi Anda tidak menyertakan contoh penggunaan sebenarnya2>&1
Izkata

Saya lupa menambahkan itu! Jawaban yang diedit untuk mencerminkan contoh. Ketika saya memiliki sedikit waktu lagi, saya akan menjelaskan cara pemesanan juga.
darnir

9

Anda perlu mengarahkan ulang output standar ( >atau 1>) dan kesalahan standar ( 2>):

ping -q -c 1 google.com > /dev/null 2>/dev/null && echo online || echo offline

atau, redirect satu ke yang lain:

ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline

8
$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline

Contohnya

$ ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline
online

$ ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline
offline

Mempercepat ping

Tergantung pada pingimplementasi Anda, Anda mungkin terbatas pada satu hitungan -c 1. Beberapa implementasi akan membiarkan Anda masuk di bawah ini, tetapi Anda pada dasarnya harus menunggu waktu pencarian yang buruk hingga batas waktu. Jadi, alih-alih menggunakan, pingAnda mungkin ingin menggunakannya fing.

lambatnya ping gagal

$ date; ping -q -c 1 google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:10 EST 2014
online
Tue Jan 28 13:51:10 EST 2014

$ date; ping -q -c 1 googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:51:15 EST 2014
offline
Tue Jan 28 13:51:25 EST 2014

jari jauh lebih cepat gagal

$ date; fing -p google.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:21 EST 2014
online
Tue Jan 28 13:49:22 EST 2014

$ date; fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; date
Tue Jan 28 13:49:35 EST 2014
online
Tue Jan 28 13:49:38 EST 2014

1
Saya lebih suka menggunakan timeperintah daripada secara manual menghitung perbedaan waktu dengan date:time { fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; }
Ruslan

@ Ruslan - terima kasih, saya melakukannya dengan cara ini b / c saya ingin output date. Lebih mudah, IMO, bagi orang lain untuk membaca output yang dihasilkan.
slm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.