我无法绕过这个。为什么/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
的任何输出。
答案 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_command
,something
,和 something_else
的输入和输出。