gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:58:05 26 4
gpt4 key购买 nike

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

if [ -o noclobber ]
then
echo "Your files are protected against accidental overwriting using redirection."
fi

我在尝试否定测试时遇到了一些奇怪的行为。对于为 [ -o OPTION ][ ! -o 选项]。这是一个例子:

$ 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 运算符:unary - o option 用于检查是否设置了选项,二进制 test1 -o test2 用于检查任一测试是否为真(逻辑或)。

您正在传递 test 三个参数,!-ohistory。让我们看看是什么 POSIX says about it如何解析三个参数:

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进行了检验,变成了“is non-空”检查(如 [ ! ][ history ])。因此结果为真。

第二个解释是你所期望的,但由于第一个解释匹配,所以没有使用它。

关于linux - 检查是否使用 [ -o OPTION ] 设置了 shell 选项,打开 OPTION 时出现奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26197439/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com