有人可以帮助我处理代码中包含的条件ls /etc/*release 1>/dev/null 2>&1
:
if ls /etc/*release 1>/dev/null 2>&1; then
echo "<h2>System release info</h2>"
echo "<pre>"
for i in /etc/*release; do
# Since we can't be sure of the
# length of the file, only
# display the first line.
head -n 1 $i
done
uname -orp
echo "</pre>"
fi
我几乎不了解这一行,但具体我想知道的是:
[ expression ]
?1>/dev/null
声明中的变量是ls
吗?2>&1
?我理解这句话的目的,是;如果在/etc/
目录下存在一个带有release的文件,那么该语句将继续,我只是不明白这是如何实现的。
谢谢你的帮助
答案 0 :(得分:3)
[
不是一个特殊字符,它是一个命令(/bin/[
或/usr/bin/[
,通常是指向test
的链接。这意味着
if [ ...
if test ...
是一样的。要实现此目的,test
会将]
忽略为最后一个参数,如果它被称为[
。
if
只是响应它调用的命令的退出代码。退出代码0表示成功或&#34; true&#34;。
1>/dev/null 2>&1
将stdout(1
)重定向到设备/dev/null
,然后将stderr(2
)重定向到stdout,这意味着该命令无法显示和输出或终端上的错误。
由于stdout不是普通文件或设备,因此您必须使用>&
进行重定向。
乍一看,人们会认为if [ -e /etc/*release ]
是更好的解决方案,但test -e
不适用于模式。
答案 1 :(得分:0)
test
程序只评估其参数并返回代码0或1来判断它是否为真。
但是你可以使用if
的任何shell命令/函数。如果返回码(then
)为0,它将执行$?
部分。
所以,在这里,我们看看ls
是否返回0(文件匹配)。
所以,最后,它等同于写if [ -e /etc/*release ] ; then
,这更像是&#34; shell-like&#34;。
最后两个语句1>/dev/null
和2>&1
就是为了避免显示ls
的输出
1>/dev/null
将stdout重定向到/dev/null
,因此未显示标准输出2>&1
将stderr重定向到stdout。在这里,stdout被重定向到/dev/null
,因此所有内容都被重定向到/dev/null