If()</dev/null
Я не могу обмотать голову вокруг этого. Зачем использовать /dev/null
как вход в оператор if
? Каково использование < /dev/null
в следующем?
if ( $PROG --version ) < /dev/null > /dev/null 2>&1; then
$PROG
else
echo "failed"
exit 1
fi
I (думаю) Я понимаю, что > /dev/null 2>&1
используется только для подавления любого выхода как из stdout
, так и stderr
.
Ответы
Ответ 1
Если $PROG
- это программа, которая ожидает ввода от stdin
, ваш script может приостановиться навсегда, пока вы не наберете что-нибудь. Использование < /dev/null
- предоставить пустой ввод такой программе. Вы правы в >
и 2>&1
.
Этот фрагмент script проверяет, завершает ли $PROG --version
статус 0 (успех), а затем запускает эту программу без каких-либо флагов. Если $PROG --version
терпит неудачу, эхосигнал script "сбой" и завершается.
Ответ 2
Я думаю, вам интересно, почему перенаправление выходит за круглые скобки.
В этой строке:
if ( $PROG --version ) < /dev/null > /dev/null 2>&1; then
скобки не являются частью синтаксиса оператора if
; они просто определяют группировку команд. (Мне потребовался момент, чтобы запомнить это сам, в csh/tcsh скобки являются частью синтаксиса оператора if
.)
Например, это:
( echo one ; echo two ) | tr a-z A-Z
будет выдавать этот результат:
ONE
TWO
В этом случае, поскольку $PROG --version
- единственная команда, скобки не нужны (если только $PROG
не расширяется до нескольких команд, но это маловероятно).
Таким образом, перенаправление не применяется к оператору if
; это относится к $PROG --version
. Цель состоит в том, чтобы не вводить вход (как будто чтение из пустого файла) в $PROG
и отбрасывать все, что он пишет, на stdout или stderr. Если $PROG
- это команда, которая читает из stdin, даже если она вызывается с помощью --version
, то без перенаправления ввода она может повесить ожидания ввода клавиатуры.
script предполагает, что он безопасно вызывать $PROG
(каким бы он ни был), только если $PROG --version
не вызывает ошибку.
Обратите внимание, что вы можете применить перенаправление к оператору if:
if test_command ; then
something
else
something_else
fi < /dev/null > /dev/null 2>&1
Это перенаправляет ввод и вывод для test_command
, something
и something_else
.