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

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

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

我已经用谷歌搜索了答案,但是找到的大多数链接都是有关I/O重定向的说明,这些说明虽然确实相关,但仍不清楚! : >>结构。

最佳答案

那是一些奇怪的代码!
:命令内置在bash中。相当于true;它什么也不做,成功。

: >> $outputFile

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

I/O重定向(例如2>/dev/null)可以出现在简单命令中的任何位置。他们不必在最后。因此,:命令的标准输出(为空)将附加到$outputFile,任何stderr输出都将重定向到/dev/null。任何这样的stderr输出都将是重定向失败的结果,因为:命令本身不会执行任何操作,也不会失败。我不知道为什么stdout的重定向(到$outputFile的末尾)和stderr的重定向(到/dev/null)在:命令的相对侧。
!运算符是逻辑“not”;它检查以下命令是否成功,并反转结果。

用英语-英语文字书写的最终结果是:

如果设置了“$ outputFile”并且它不是一个空字符串,则如果我们没有写权限,则使用,然后以状态1终止脚本。

简而言之,它测试我们是否能够写入$outputFile,如果不能,则进行测试。

10-07 16:24