gpt4 book ai didi

庆典 [ : too many arguments greater than symbol

转载 作者:行者123 更新时间:2023-11-29 09:10:59 24 4
gpt4 key购买 nike

这不是一个真正的问题(虽然我在最后提出了一个问题),而是我想分享的一个问题的解决方案,以防它对其他人有帮助。

很长一段时间以来,我在打开新终端时收到 bash: [: too many arguments(特别是安装了 bash-completion macport 的 OS X 上的 iTerm2)。此错误源自行 if [ -n "$BASH_VERSION"-a -n "$PS1"-a -z "$BASH_COMPLETION_COMPAT_DIR"];然后在文件 /opt/local/etc/bash_completion。我终于找到了问题所在,因为我在我的 .bash_profile 中有 export PS1='>'。将 PS1 更改为其他内容(例如 '> ')可解决 bash 补全问题。

在 OS X 和 Debian 中进行的一些实验表明,在将额外的表达式(使用 -a-o)添加到测试 ([ ] ) 在涉及 '>' 的表达式之后。例如,

> A='>'; if [ -n "$A" ]; then echo "yes"; fi
yes
> A='>'; if [ -n "$A" -a -n "$A" ]; then echo "yes"; fi
bash: [: too many arguments
> A='> '; if [ -n "$A" -o -n "$A" ]; then echo "yes"; fi
yes
> A='>'; if [ -n "$A" -o -n "Hello" ]; then echo "yes"; fi
bash: [: too many arguments
> A='>'; if [ -n "Hello" -a -n "$A" ]; then echo "yes"; fi
yes

这是 bash 中的(已知)错误吗?

最佳答案

你的解决方法是有效的,只要字符串存储在$A不是 [运算符/test识别 - 正如您所发现的,只需添加一个空格就足够了。

Surely the "greater than" should be interpreted as just a string? It works with '> ' after all.

没有,$A的内容被解释为一个字符串。 (如果你想要那样,你必须改用 [[,它在特殊的上下文中被解析,更像你对传统编程语言的期望。)

[ ( test ) 是内置的(在大多数系统上也作为外部实用程序存在),因此使用命令语法 进行解析,这意味着:

  • shell 首先执行它的扩展 - $A在这种情况下,引用将替换为变量的内容。
  • 然后将结果传递给[

因此,从[的角度来看, 它最终看到的运算符是否无关紧要 - >在您的示例中 - 来自文字或存储在变量中。

但请注意,空格很重要:传递 > (无空格)被解释为运算符; > ,相比之下,><space>不是 - 因为确切的文字 比运算符更多


底线是:

  • 您使用的 bash 完成脚本不够健壮
  • 正如@chepner 在对该问题的评论中所述,POSIX recommends not using -o / -a 为了避免您遇到的歧义(强调我的):

The XSI extensions specifying the -a and -o binary primaries and the '(' and ')' operators have been marked obsolescent. (Many expressions using them are ambiguously defined by the grammar depending on the specific expressions being evaluated.)

  • 具体来说,使用单独的 [ ... ]&& 连接的表达式(而不是 -a )和 || (而不是 -o )解决了问题:

    [ -n "$BASH_VERSION" ] && [ -n "$PS1" ] && [ -z "$BASH_COMPLETION_COMPAT_DIR" ]

或者,更简单地说,利用非空字符串的计算结果为真:

[ "$BASH_VERSION" ] && [ "$PS1" ] && [ -z "$BASH_COMPLETION_COMPAT_DIR" ]

注意虽然 -a-o引入歧义,它们不是安全问题 - 您不能通过使用它们来注入(inject)任意代码。

关于庆典 [ : too many arguments greater than symbol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35578327/

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