Linux 检查shell选项是否设置了[-o选项],选项打开时会出现奇怪的行为
我正在阅读Linux文档项目中的bash指南。 在第81页和第82页,有一个简短的示例脚本,用于测试是否设置了选项:Linux 检查shell选项是否设置了[-o选项],选项打开时会出现奇怪的行为,linux,bash,gnu,Linux,Bash,Gnu,我正在阅读Linux文档项目中的bash指南。 在第81页和第82页,有一个简短的示例脚本,用于测试是否设置了选项: if [ -o noclobber ] then echo "Your files are protected against accidental overwriting using redirection." fi 我在试图否定测试时遇到了一些奇怪的行为。对于为[-o OPTION]和[!-o OPTION]打开的所有选项,我得到的返回值为0。下面是一个例子
if [ -o noclobber ]
then
echo "Your files are protected against accidental overwriting using redirection."
fi
我在试图否定测试时遇到了一些奇怪的行为。对于为[-o OPTION]
和[!-o OPTION]
打开的所有选项,我得到的返回值为0。下面是一个例子:
$ set -o | grep errex
errexit off
$ [ -o errexit ]; echo $?
1
$ [ ! -o errexit ]; echo $?
0
$ set -o | grep history
history on
$ [ -o history ]; echo $?
0
$ [ ! -o history ]; echo $?
0
改用
[!-o选项]]
。解析[[]]
中的表达式更容易预测
您看到的[
的结果是因为在bash的test
内置:一元-o选项中有两个-o
操作符,用于检查是否设置了选项,而二进制test1-o test2>用于检查其中一个测试是否为真(逻辑或)
您正在通过测试
三个参数、!
、-o
和历史记录
。让我们看看如何解析三个参数:
3 arguments:
- If $2 is a binary primary, perform the binary test of $1 and $3.
- If $1 is '!', negate the two-argument test of $2 and $3.
(...)
-o
,实际上是一个二进制运算符,因此它执行了$1
和$3
的测试,这两个测试变成了“非空”检查(如[!]
和[历史记录]
),因此结果是正确的
第二个解释是您所期望的,但由于第一个解释匹配,因此没有使用它。请改用[[!-o option]]
。解析[[]]
中的表达式更容易预测
您看到的[
的结果是因为在bash的test
内置:一元-o选项中有两个-o
操作符,用于检查是否设置了选项,而二进制test1-o test2>用于检查其中一个测试是否为真(逻辑或)
您正在通过测试
三个参数、!
、-o
和历史记录
。让我们看看如何解析三个参数:
3 arguments:
- If $2 is a binary primary, perform the binary test of $1 and $3.
- If $1 is '!', negate the two-argument test of $2 and $3.
(...)
-o
,实际上是一个二进制运算符,因此它执行了$1
和$3
的测试,这两个测试变成了“非空”检查(如[!]
和[历史记录]
),因此结果是正确的
第二个解释是您所期望的,但由于第一个解释匹配,因此没有使用它。我看不到-o做了您所期望的人工测试
,grep-A1“\-o”
。我看不到-o做了您所期望的人工测试
。![-o选项]
在不太可能的情况下也是可能的,即您有一个shell不理解[[
@rici-o
,因为选项本身是特定于bash的,所以这确实不太可能。这一点很好。知道这一点仍然很有用!不只是用于括号内。谢谢,您能解释一下为什么使用时会出现这种行为吗[[工作正常吗?@timgeb这基本上是[
中的一个bug或不正常功能,为了向后兼容,它必须保持在原位。[[
几十年后才出现,不必携带相同的遗留行李。+1。![-o选项]
在不太可能的情况下也是可能的,即您有一个shell不理解[[
@rici-o
,因为选项本身是特定于bash的,所以这确实不太可能。这一点很好。知道这一点仍然很有用!不只是用于括号内。谢谢,您能解释一下为什么使用时会出现这种行为吗[[工作正常吗?@timgeb这基本上是[
中的一个bug或故障,为了向后兼容,它必须保持在原来的位置。[[
几十年后才出现,不必携带相同的遗留行李。