Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 检查shell选项是否设置了[-o选项],选项打开时会出现奇怪的行为_Linux_Bash_Gnu - Fatal编程技术网

Linux 检查shell选项是否设置了[-o选项],选项打开时会出现奇怪的行为

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。下面是一个例子

我正在阅读Linux文档项目中的bash指南。 在第81页和第82页,有一个简短的示例脚本,用于测试是否设置了选项:

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或故障,为了向后兼容,它必须保持在原来的位置。
[[
几十年后才出现,不必携带相同的遗留行李。