这个来自bash脚本的if语句有什么作用?

时间:2014-08-27 20:25:10

标签: linux bash

我是新手,通过一些例子来编写脚本和学习。我看到的一个例子是使用if语句来测试先前分配的输出文件是否有效,如下所示:

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

我理解[ -n "$outputFile" ]的作用,但不了解条件的其余部分。有人可以解释! 2>/dev/null : >> $outputFile的意思/做什么吗?

我已经搜索了答案,但找到的大多数链接都是I / O重定向的解释,这些内容肯定是相关的,但仍然不清楚! : >>结构。

2 个答案:

答案 0 :(得分:5)

这是一些奇怪的代码!

:命令内置于bash中。它相当于true;它没有成功,成功。

: >> $outputFile

尝试不执行任何操作,并将(空)输出附加到$outputFile - 已经确认为非空字符串。如果文件尚不存在,>>重定向运算符将创建该文件。

2>/dev/null等I / O重定向可以出现在简单命令的任何位置;他们不必在最后。因此:命令的stdout(为空)附加到$outputFile,任何stderr输出都被重定向到/ dev / null。任何这样的stderr输出都是重定向失败的结果,因为:命令本身什么也不做,并且不会失败。我不知道为什么stdout的重定向(到$outputFile的末尾和stderr的重定向(到/dev/null)在:命令的两侧。

!运算符是逻辑“不”;它检查以下命令是否成功,并反转结果。

用英文写成的最终结果是:

如果设置了“$ outputFile”且不是空字符串,如果我们没有写入权限,则终止状态为1的脚本。

简而言之,它测试我们是否能够写入$outputFile,如果我们不这样做就会失败。

答案 1 :(得分:4)

脚本试图确保$outputFile以不太明显的方式写入。

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

如果文件不可写,则命令失败,这使得条件为真,因为它被!否定并且脚本退出。