我无法解决这个问题。为什么会/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
。
如果$PROG
是一个期望来自 输入的程序,那么stdin
您的脚本可能会永远停止等待您输入某些内容。 的用途< /dev/null
是为这样的程序提供一个空输入。你是对的>
and 2>&1
。
此脚本片段正在检查是否$PROG --version
以 0 状态(成功)退出,然后运行该程序而没有任何标志。如果$PROG --version
失败,脚本会回显“失败”并退出。
我想你想知道为什么重定向在括号之外。
在这一行:
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