我无法绕过这个.为什么将/dev/null
用作if
语句的输入?以下是什么用途< /dev/null
?
if ( $PROG --version ) < /dev/null > /dev/null 2>&1; then
$PROG
else
echo "failed"
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
我(觉得)我明白,> /dev/null 2>&1
只是用来抑制来自任何输出stdout
和stderr
.
Car*_*rum 16
如果$PROG
是一个期望输入的程序stdin
,你的脚本可能永远停止等待你输入内容.使用< /dev/null
is来为这样的程序提供空输入.你说得对的>
和2>&1
.
这段脚本正在检查是否$PROG --version
以0状态(成功)退出,然后运行该程序而没有任何标志.如果$PROG --version
失败,则脚本回显"失败"并退出.
Kei*_*son 14
我想你想知道为什么重定向在括号之外.
在这一行:
if ( $PROG --version ) < /dev/null > /dev/null 2>&1; then
Run Code Online (Sandbox Code Playgroud)
括号不是if
语句语法的一部分; 他们只是指定命令分组.(我花了一点时间记住了自己;在csh/tcsh中,括号是if
语句语法的一部分.)
例如,这个:
( echo one ; echo two ) | tr a-z A-Z
Run Code Online (Sandbox Code Playgroud)
将产生此输出:
ONE
TWO
Run Code Online (Sandbox Code Playgroud)
在这种情况下,由于$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
Run Code Online (Sandbox Code Playgroud)
这种重定向输入和输出test_command
,something
,和 something_else
.
归档时间: |
|
查看次数: |
5990 次 |
最近记录: |