我不能理解这件事。为什么要将/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的任何输出。
发布于 2012-09-11 14:33:54
如果$PROG是一个需要来自stdin的输入的程序,那么您的脚本可能会永远停止,等待您键入某些内容。< /dev/null的用法是为这样的程序提供一个空输入。你对>和2>&1的看法是对的。
这段脚本正在检查$PROG --version是否以0状态(成功)退出,然后在没有任何标志的情况下运行该程序。如果$PROG --version失败,脚本将回显"failed“并退出。
发布于 2012-09-11 15:01:34
我想您可能想知道为什么重定向在括号之外。
在这一行中:
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提供输入(就像从空文件中读取一样),并丢弃它写入标准输出或标准错误的任何内容。如果$PROG是一个从标准输入读取的命令,即使使用--version调用,如果没有输入重定向,它可能会挂起等待键盘输入。
该脚本假定,只有当$PROG --version不产生错误时,才可以安全地调用$PROG (不管它是什么)。
请注意,您可以对if语句应用重定向:
if test_command ; then
something
else
something_else
fi < /dev/null > /dev/null 2>&1这将重定向test_command、something和something_else的输入和输出。
https://stackoverflow.com/questions/12363916
复制相似问题