Kiedy biegniesz:
ping -q -c 1 google.com > /dev/null && echo online || echo offline
Jesteś w zasadzie tylko przekierowanie wyjścia strumienia 1 (tj stdout
) w celu /dev/null
.
Jest to dobre, gdy chcesz przekierować dane wyjściowe, które powstają podczas normalnego wykonywania programu. Jeśli jednak chcesz przekierować dane wyjściowe spowodowane przez wszystkie błędy, ostrzeżenia lub awarie, powinieneś również przekierować stderr
strumień lub Błąd standardowy /dev/null
.
Jednym ze sposobów na to jest dodanie numeru strumienia, który chcesz przekierować do operatora przekierowania, na >
przykład:Command 2> /dev/null
Dlatego twoje polecenie wyglądałoby następująco:
ping -q -c 1 google.com > /dev/null 2> /dev/null && echo online || echo offline
Zauważ jednak, że przekierowaliśmy już jeden strumień do /dev/null
. Dlaczego nie po prostu piggyback na tym samym przekierowaniu? Bash pozwala nam to zrobić, określając numer strumienia, na który należy przekierować. 2>&1
.
Zwróć uwagę na &
znak po operatorze przekierowania. Mówi to powłoce, że to, co pojawi się później, nie jest nazwą pliku, ale identyfikatorem strumienia wyjściowego.
ping -q -c 1 google.com > /dev/null 2>&1 echo online || echo offline
Uważaj na operatorów przekierowań, ich kolejność ma duże znaczenie. Jeśli przekierujesz w niewłaściwej kolejności, otrzymasz nieoczekiwane wyniki.
Innym sposobem na osiągnięcie całkowitej ciszy jest przekierowanie wszystkich strumieni wyjściowych do /dev/null
korzystania z tego skrótu: &>/dev/null
(lub przekierowanie do pliku dziennika za pomocą &>/path/to/file.log
).
Dlatego napisz polecenie jako:
ping -q -c 1 google.com &> /dev/null && echo online || echo offline
&>/dev/null
to jest. Dziękujemy wszystkim za natychmiastową pomoc!Be careful with the redirection operators, their order matters a lot.
, ale nie podałeś przykładu faktycznego używania2>&1
Musisz przekierować zarówno standardowe wyjście (
>
lub1>
), jak i błąd standardowy (2>
):lub przekieruj jeden na drugi:
źródło
Przykłady
Przyspieszenie ping
W zależności od
ping
implementacji możesz być ograniczony do jednej liczby-c 1
. Niektóre implementacje pozwolą Ci zejść poniżej tego, ale zasadniczo musisz poczekać na przekroczenie limitu czasu złych wyszukiwań. Więc zamiast używać,ping
możesz chcieć użyćfing
zamiast tego.powolność pingowania zawodzącego
palec jest znacznie szybszy do porażki
źródło
time
polecenia niż ręcznie obliczać różnicę czasu zdate
:time { fing -p googleadf.com > /dev/null 2>&1 && echo online || echo offline; }
date
. IMO łatwiej komuś innemu odczytać wygenerowane dane wyjściowe.