如何:`如果ls / etc / * release 1> / dev / null 2>& 1`工作?请解释一下

时间:2015-02-26 15:14:05

标签: linux bash if-statement

有人可以帮助我处理代码中包含的条件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

我几乎不了解这一行,但具体我想知道的是:

  1. 为什么不必使用'test'语法,即[ expression ]
  2. 条件中的间距也会混淆,1>/dev/null声明中的变量是ls吗?
  3. 什么是2>&1
  4. 我理解这句话的目的,是;如果在/etc/目录下存在一个带有release的文件,那么该语句将继续,我只是不明白这是如何实现的。

    谢谢你的帮助

2 个答案:

答案 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/null2>&1就是为了避免显示ls的输出

  • 1>/dev/null将stdout重定向到/dev/null,因此未显示标准输出
  • 2>&1将stderr重定向到stdout。在这里,stdout被重定向到/dev/null,因此所有内容都被重定向到/dev/null