2014-08-27 63 views
7

我是新来的bash脚本和学习通过一些例子。其中之一,我看到的例子是使用if语句来测试是否先前分配的输出文件是有效的,这样的:这是一个bash脚本的if语句吗?

if [ -n "$outputFile" ] && ! 2>/dev/null : >> $outputFile ; then 
    exit 1 
fi 

我明白[ -n "$outputFile" ]做,但条件不休息。有人可以解释什么! 2>/dev/null : >> $outputFile意味着什么?

我已经搜索了答案,但大多数发现的链接都是I/O重定向的解释,这些解决方案与! : >>结构有关,但仍然不明确。

+0

你从哪里看到它的?它说它做了什么? – 2014-08-27 20:34:28

+0

可以重写为'if [[$ outputFile]] && [[! -w $ outputFile]];然后退出; fi' – 2014-08-27 20:40:35

+0

@glennjackman:'-w'假定文件已经存在,所以它不完全相同。 – FatalError 2014-08-27 20:41:41

回答

5

这是一些奇怪的代码!

:命令内置到bash中。这相当于true;它什么都不做,成功。

: >> $outputFile 

尝试做什么,并追加(空)输出到$outputFile - 这已经被证实为一个非空字符串。如果该文件不存在,则重定向操作符将创建文件>>

I/O重定向如2>/dev/null可以以简单的命令任何位置出现。他们不一定非要结束。所以:命令(它是空的)的标准输出被附加到$outputFile之后,并且任何stderr输出都被重定向到/ dev/null。任何这样的stderr输出都将是重定向失败的结果,因为:命令本身不会执行任何操作,并且不会失败。我不知道为什么标准输出的重定向(到的$outputFile结束和错误的重定向(到/dev/null)位于:命令的相对侧

!操作者是一个逻辑“非”;它检查无论

最终结果下面的命令成功,反转的结果,用英文写的上下的文字是:

如果“$ OUTPUTFILE”设置,而不是一个空字符串,如果我们没有权限写入,然后终止状态为1的脚本。

简而言之,它测试我们是否能够写入$outputFile,并且如果我们不写,就会退出。

+1

一个为彻底的解释!关于为什么“stderr(到/ dev/null)的重定向位于:command的两侧”,我做了一些测试。创建一个只读文件/ tmp/bob,并运行'2>/dev/null:>>/tmp/bob'和':>>/tmp/bob 2>/dev/null'。前者不打印,后者打印'bash:/ tmp/bob:Permission denied'。 – BigHead 2014-08-27 21:58:30

+0

@ GongyuWang:很奇怪;在'2>/dev/null之后:>>/tmp/bob'我得到'$?'= 0(和一个空的'/ tmp/bob'文件)。如果我首先创建'/ tmp/bob'作为目录或作为我无法写入的文件(现在我实际上读取了您的整个评论,我意识到您所做的),我会得到'$?'= 1。 – 2014-08-27 22:17:22

+1

@GongyuWang:我可以使用':2>/dev/null >>/tmp/bob'来避免错误信息。 '2/dev/null'必须在'>>/tmp/bob'之前;它不必在':'命令之前。 – 2014-08-27 22:20:08

4

脚本试图确保$outputFile是在不那么明显的方式写。

:bash空命令,它什么都不做。 stderr重定向到/dev/null的事实仅仅是为了抑制权限被拒绝的错误,如果发生的话。

如果该文件是不可写,那么命令失败,这使得真正的,因为它与!否定和脚本退出条件。

+0

好,简洁的答案!谢谢。 – BigHead 2014-08-27 22:02:28