我是新手,通过一些例子来编写脚本和学习。我看到的一个例子是使用if语句来测试先前分配的输出文件是否有效,如下所示:
if [ -n "$outputFile" ] && ! 2>/dev/null : >> $outputFile ; then
exit 1
fi
我理解[ -n "$outputFile" ]
的作用,但不了解条件的其余部分。有人可以解释! 2>/dev/null : >> $outputFile
的意思/做什么吗?
我已经搜索了答案,但找到的大多数链接都是I / O重定向的解释,这些内容肯定是相关的,但仍然不清楚! : >>
结构。
答案 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
这一事实只是为了抑制权限被拒绝错误,如果发生错误的话。
如果文件不可写,则命令失败,这使得条件为真,因为它被!
否定并且脚本退出。