Myślę, że zastanawiasz się, dlaczego przekierowanie jest poza nawiasami.
W tej linii:
if ($PROG --version) </dev/null> /dev/null 2>&1; then
nawiasy nie są częścią składni rachunku if
; po prostu określają grupy poleceń. (Zajęło mi chwilę, aby pamiętać, że sam; w csh/tcsh nawiasach są częścią składni instrukcji if
.)
Na przykład ten:
(echo one ; echo two) | tr a-z A-Z
przyniesie to wyjście :
ONE
TWO
W tym przypadku, ponieważ $PROG --version
jest jedno polecenie, nawiasy są konieczne (chyba $PROG
rozszerza się do więcej niż jednego polecenia, ale to mało prawdopodobne).
Tak więc przekierowanie nie ma zastosowania do instrukcji if
; dotyczy to $PROG --version
. Celem jest zapewnienie braku danych wejściowych (tak jak czytanie z pustego pliku) do $PROG
i odrzucić wszystko, co napisze do stdout lub stderr. Jeśli $PROG
jest poleceniem odczytującym ze standardowego wejścia, nawet po wywołaniu z --version
, to bez przekierowania wejścia może zawiesić oczekiwanie na wejście klawiatury.
Skrypt zakłada, że można bezpiecznie wywołać $PROG
(cokolwiek może być) tylko wtedy, gdy $PROG --version
nie spowoduje błędu.
pamiętać, że może zastosować przekierowanie do if:
if test_command ; then
something
else
something_else
fi </dev/null> /dev/null 2>&1
ten przekierowuje wejście i wyjście dla test_command
, something
, isomething_else
.
Dzięki. Nadal nie jestem pewien, na ile jest to przydatne, jeśli wiem, czym jest '$ PROG' i wiem, że' PROG --version' nie czeka na dane wejściowe. Na przykład 'PROG = autoconf' to taki, w którym to zobaczyłem.I wiem, że 'autoconf --version' nie czeka na dane wejściowe. Czy nadal jest przydatna w tym przypadku? –
@Carl Norum, czy można użyć 'if ('$ PROG --version')' (z nawiasami ostrymi), aby wykonać polecenie, a zatem nie ma potrzeby używania ' dev/null'? – fduff
Uchwyty kątowe? –