为什么“cat {foo}”不输出foo,而“cat {foo,bar}”会输出?

CDP*_*DPF 12 bash brace-expansion cat

我试图连接子文件夹中的文本文件并尝试:

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var
Run Code Online (Sandbox Code Playgroud)

然而,这并没有返回任何东西。因此,尝试添加一个不存在的“subfolder2”

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var
Run Code Online (Sandbox Code Playgroud)

这一次它确实成功了,成功地连接了文件。为什么会发生这种情况?

小智 22

根据定义,GNU Bash 中的大括号扩展需要一个序列表达式或一系列逗号分隔的值:

要大括号扩展的模式采用可选前导码的形式,后跟一系列逗号分隔的字符串或一对大括号之间的序列表达式,后跟可选的后记。

您可以阅读手册了解详细信息。

几个简单的例子:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 21

{subfolder1}评估为{subfolder1},因为没有替代方案。使用subfolder1来代替。

  • 请注意,它与 `csh`(大括号扩展的来源)、`tcsh` 或 `fish` 不同。 (2认同)