Bash:允许在命令参数中使用括号(即防止“意外标记 '(' ”)

Bash:允许在命令参数中使用括号(即防止“意外标记 '(' ”)

我经常使用一个命令行程序,我提供的参数包含括号。为了简单起见,假设我正在写

echo 'bar(1,3)'

我想省略引号。但是,如果我这样做,我会得到syntax errror near unexpected token '('.我猜这与子壳有关。如果这是唯一的方法,我愿意禁用它们。 (尽管如果子 shell 不在命令开头,则无法启动它,因此据我所知,它们没有理由禁止在参数中使用括号)

答案1

()是语法中的特殊标记字符,bash用于许多运算符,包括:

  • (...)子壳结构
  • func() compound-command函数定义
  • $(...)命令替换
  • <(...),>(...)过程替代
  • ((...))算术评估结构
  • $((...))算术展开
  • a=(...),a+=(...)数组赋值运算符
  • @(...), +(...), *(...), ?(...)glob 运算符(使用 extglob)
  • [[ (a && b) || (c && d) ]]对条件表达式运算符进行分组
  • [[ ... =~ ...(...)... ]]正则表达式运算符。

echo a=(b)是语法错误,但不是export a=(b)

echo a)(是一个语法错误,除非上面的构造之一的前几行部分有一个空缺。

虽然可以编写一个 readline 钩子,在需要的地方添加引号()以避免语法错误,但这将需要相当大的努力,因为这意味着要对 shell 语法进行完整的解析。

当您意识到当前单词包含 shell 特有的字符时为时已晚,更好的方法可能是使用引用当前单词的快捷方式。

zsh(假设emacs模式):

bindkey -s '\e#' '\C@\eb\Cx\Cx\e"'

引用Alt+#当前的单词

或者近似bash(也假设emacs众数):

bind "\"\e#\": \"'\e \eb'\C-X\C-X\""

答案2

这可能是一个坏主意(请参阅评论),但我遇到了同样的问题,我通过创建一个在使用它之前更改[(]的函数来解决它:)

echo2() {
    expression=$(echo $@ | tr '[]' '()')
    echo "$expression"
}

输入:

echo2 bar[1,3]

结果:

bar(1,3)

不知道[和是不是]经过shell特殊处理的。但如果您愿意使用它们来代替()的功能,也许这对您来说是一个解决方案。

相关内容