Подтвердить что ты не робот

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.

4b9b3361

Ответ 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.