Bash 如果()</dev/null

Bash 如果()</dev/null,bash,unix,Bash,Unix,我不能对这件事耿耿于怀。为什么要将/dev/null用作if语句的输入?&1;然后 $PROG 其他的 回显“失败” 出口1 fi 我(想)我知道/dev/null 2>&1只是用来抑制stdout和stderr的任何输出,如果$PROG是一个需要从stdin输入的程序,那么脚本可能会永远停止,等待您键入内容。&1你说得对 这段脚本正在检查$PROG--version是否以0状态(成功)退出,然后在没有任何标志的情况下运行该程序。如果$PROG--version失败,脚本将回显“failed”

我不能对这件事耿耿于怀。为什么要将
/dev/null
用作
if
语句的输入?
在以下内容中有什么用途

if ( $PROG --version ) < /dev/null > /dev/null 2>&1; then
        $PROG
else
        echo "failed"
        exit 1
fi
if($PROG--version)/dev/null 2>&1;然后
$PROG
其他的
回显“失败”
出口1
fi

我(想)我知道
/dev/null 2>&1
只是用来抑制
stdout
stderr

的任何输出,如果
$PROG
是一个需要从
stdin
输入的程序,那么脚本可能会永远停止,等待您键入内容。
的用途是为这样的程序提供一个空输入。关于
2>&1
你说得对


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

我想您可能想知道为什么重定向在括号外

在这方面:

if ( $PROG --version ) < /dev/null > /dev/null 2>&1; then
将产生以下输出:

ONE
TWO
在本例中,由于
$PROG--version
是一个命令,因此不需要括号(除非
$PROG
扩展为多个命令,但不太可能)

因此重定向不适用于
if
语句;它适用于
$PROG--version
。其目的是不向
$PROG
提供任何输入(就像从空文件读取一样),并丢弃它写入stdout或stderr的任何内容。如果
$PROG
是一个从stdin读取的命令,即使在使用
--version
调用时,如果没有输入重定向,它也可能挂起等待键盘输入

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

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

if test_command ; then
    something
else
    something_else
fi < /dev/null > /dev/null 2>&1
if-test\u命令;然后
某物
其他的
还有别的吗
fi/dev/null 2>&1

这将重定向
test_命令
某物
、以及
其他某物

的输入和输出。谢谢。如果我知道
$PROG
是什么,并且知道
PROG--version
没有等待输入,我仍然不确定这有多有用。例如,
PROG=autoconf
就是我看到这一点的地方。我知道,
autoconf--version
并没有等待输入。在这种情况下它仍然有用吗?@Carl Norum,这里是否可以使用
if(“$PROG--version”)
(带尖括号)来执行命令,因此不需要
?@fduff:(a)您的注释中没有尖括号。(b) 您有单引号,这将导致shell将
'$PROG--version'
视为字符串文字,而不是要执行的命令,这将是一个错误,除非您碰巧有一个名为
'$PROG--version'
的命令。你能澄清一下你的问题吗?我的意思是:“
$PROG--version
”来执行命令。“
”在SO中用于
code`格式。谢谢您的回答!我确实对括号感到困惑。谢谢你为我把它分解并举例说明。很好的解释。
if test_command ; then
    something
else
    something_else
fi < /dev/null > /dev/null 2>&1