18

我无法解决这个问题。为什么会/dev/null被用作if语句的输入?下面有什么用< /dev/null

if ( $PROG --version ) < /dev/null > /dev/null 2>&1; then
        $PROG
else
        echo "failed"
        exit 1
fi

我(认为)我知道这> /dev/null 2>&1只是用来抑制stdout和的任何输出stderr

4

2 回答 2

17

如果$PROG是一个期望来自 输入的程序,那么stdin您的脚本可能会永远停止等待您输入某些内容。 的用途< /dev/null是为这样的程序提供一个空输入。你是对的>and 2>&1

此脚本片段正在检查是否$PROG --version以 0 状态(成功)退出,然后运行该程序而没有任何标志。如果$PROG --version失败,脚本会回显“失败”并退出。

于 2012-09-11T06:33:53.967 回答
15

我想你想知道为什么重定向在括号之外。

在这一行:

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是从标准输入读取的命令,即使使用 调用--version,那么如果没有输入重定向,它可能会挂起等待键盘输入。

该脚本假定只有在不产生错误时才可以安全地调用$PROG(无论它可能是什么) 。$PROG --version

请注意,您可以将重定向应用于 if 语句:

if test_command ; then
    something
else
    something_else
fi < /dev/null > /dev/null 2>&1

test_command这会重定向、something的输入和输出。 something_else

于 2012-09-11T07:01:33.743 回答