bash 中 (abc) 是如何解析的

JRR*_*JRR 3 command-line bash

我正在使用一个为 Windows 设计的程序,我自己为 GNU/linux 编译了该程序。该程序在命令行中运行,一个参数如下所示:

prgm -arg1 abcd(10)(22) -i files.ext
Run Code Online (Sandbox Code Playgroud)

其中(10)和是诸如、和之(22)类的标志。该命令失败,因为尝试解释内部内容并且存在语法错误。所以,我有两个问题:abcdbash()

  1. 在这种情况下,bash 实际上试图用括号做什么?为什么会失败?
  2. 我可以更改源代码,例如当程序识别另一个符号时。例如,我可以使用花括号代替括号。什么符号是安全的?

Rin*_*ind 11

Bash 将它们解释为列表:

(列表)

list 在子 shell 环境中执行(请参阅下面的命令执行环境)。影响 shell 环境的变量分配和内置命令在命令完成后不再有效。返回状态是列表的退出状态。


什么符号是安全的?

Bash 使用大量字符并希望您转义符号。这是具有特殊含义的符号列表:

!#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Run Code Online (Sandbox Code Playgroud)

你需要转义()如果这些是字符(添加\在前面)

因此,在您的情况下,以下内容将被解释为纯文本:

prgm -arg1 abcd\(10\)\(22\) -i files.ext
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用引号或双引号,如下所示:

prgm -arg1 "abcd(10)(22)" -i files.ext
Run Code Online (Sandbox Code Playgroud)

  • @JRR 不要使用大括号,因为它们在 bash 中用于大括号扩展...比较 ecample 的输出 `echo abcd{10}{22}` 和 `echo abcd{10,20}{22}` (11认同)
  • @JRR,如果您考虑使用“[]”,请注意,它们用于文件名/通配符扩展(又名通配符),如果设置了“shopt -s nullglob”,bash将默默地吃掉您的参数。(或者只是在 zsh 上出错,默认情况下不匹配任何内容的 glob 都是错误) (6认同)