Herhangi bir komutun çıktısı nasıl yeniden yönlendirilir?


14

Tüm pingçıkış olmadan ağ durumumu izlemek için basit bir komut dosyası yazmaya çalışıyorum :

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

Sorun şu ki, bağlı olmadığımda hala çıkışımda bir hata mesajı alıyorum:

ping: unknown host google.com
offline

Bu hata mesajını çıkışımdan nasıl koruyabilirim?

Yanıtlar:


28

Koştuğunuzda:

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

Aslında yalnızca Akış 1'in (yani stdout) çıktısını yeniden yönlendiriyorsunuzdur /dev/null.

Bu, bir programın normal yürütülmesi tarafından üretilen çıktıyı yeniden yönlendirmek istediğinizde sorun değildir. Ancak, tüm hataların, uyarıların veya hataların neden olduğu çıkışı da yeniden yönlendirmek isterseniz, stderrveya Standart Hata akışını da yeniden yönlendirmelisiniz /dev/null.

Bunu yapmanın bir yolu, yeniden yönlendirme operatörüne yeniden yönlendirmek istediğiniz akış sayısını şu şekilde eklemektir >:Command 2> /dev/null

Bu nedenle, komutunuz şöyle görünecektir:

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

Ancak, zaten bir akışı yeniden yönlendirdiğimizi unutmayın /dev/null. Neden aynı yönlendirmede sırtıma değil? Bash, yönlendirilecek akış numarasını belirterek bunu yapmamıza izin verir. 2>&1.

&Yönlendirme işlecinden sonraki karaktere dikkat edin . Bu, kabuğa bir sonraki adımın bir dosya adı olmadığını, ancak çıktı akışı için bir tanımlayıcı olduğunu söyler.

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

Yönlendirme operatörlerine dikkat edin, sıralamaları çok önemlidir. Yanlış sırada yeniden yönlendirirseniz, beklenmedik sonuçlarla karşılaşırsınız.

Sessizliğe tam olarak erişebilmenin başka bir yolu, tüm çıkış akışlarını /dev/nullbu kısayolu kullanarak &>/dev/nullyeniden yönlendirmektir : (veya ile bir günlük dosyasına yönlendirebilirsiniz &>/path/to/file.log).

Bu nedenle, komutunuzu şu şekilde yazın:

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

1
Aha &>/dev/nullöyle. Anlık yardım için hepinize teşekkürler!
operalala

4
Be careful with the redirection operators, their order matters a lot., ancak gerçekte kullanma örneği 2>&1
eklemediniz

Bunu eklemeyi unutmuştum! Cevabı örneği yansıtacak şekilde düzenlenmiştir. Ellerimde biraz daha zamanım olduğunda siparişin nasıl çalıştığını da anlatacağım.
darnir

9

Hem standart çıktıyı ( >veya 1>) hem de standart hatayı ( 2>) yeniden yönlendirmeniz gerekir :

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

veya birini diğerine yönlendirin:

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

Örnekler

$ 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

Ping hızlanıyor

Uygulamanıza bağlı olarak, pingtek bir sayımla sınırlı olabilirsiniz -c 1. Bazı uygulamalar bunun altına inmenize izin verir, ancak aslında kötü aramaların zaman aşımına uğramasını beklemek zorundasınız. Yani pingkullanmak fingyerine kullanmak isteyebilirsiniz .

ping yavaşlığı başarısız

$ 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

parmak başarısız olmak için çok daha hızlı

$ 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
timeManuel olarak zaman farkını hesaplamak yerine komutu kullanmayı tercih ederim date:time { fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; }
Ruslan

@Ruslan - teşekkürler, bu şekilde yaptım b / c çıktı istedim date. IMO, üretilen çıktıyı başka birinin okuması daha kolaydır.
slm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.