if()<的/ dev / null的

时间:2012-09-11 06:28:58

标签: bash unix

我无法绕过这个。为什么/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仅用于抑制stdoutstderr的任何输出。

2 个答案:

答案 0 :(得分:16)

如果$PROG是一个需要stdin输入的程序,那么您的脚本可能会永远失速,等待您输入内容。< /dev/null的用法是提供一个空输入这样的程序。你对>2>&1的看法是正确的。

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

答案 1 :(得分:14)

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

在这一行:

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调用时,也没有输入重定向,它可能会挂起等待键盘输入。

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

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

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

这会重定向test_commandsomething something_else的输入和输出。