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

Big*_*ead 7 linux bash

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

if [ -n "$outputFile" ] && ! 2>/dev/null : >> $outputFile ; then
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

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

我已经google搜索答案,但发现的大多数链接都是I/O重定向的解释,这些都是相关的,但仍然不清楚! : >>结构.

Kei*_*son 5

这是一些奇怪的代码!

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

: >> $outputFile
Run Code Online (Sandbox Code Playgroud)

尝试什么都不做,并将(空)输出附加到$outputFile- 已经确认为非空字符串.>>如果文件尚不存在,重定向操作符将创建该文件.

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

所述!操作者是一个逻辑"非"; 它检查以下命令是否成功,并反转结果.

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

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

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