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

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

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

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var

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

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var

这次确实成功了,成功连接了文件。为什么会出现这种情况?

答案1

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

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

你可以阅读手册了解详情。

一些简单的示例:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2

答案2

{subfolder1}评估为{subfolder1},因为没有其他选择。代替使用subfolder1

答案3

仅当大括号具有逗号分隔的字符串时才会扩展,例如在它们之间指定的 {abc,def} 或范围,例如 {a..e}。

在您的情况下,您可以只编写 subfolder1 而不用大括号将其括起来,因为不需要这样做

cat ./{mainfolder1,mainfolder2,mainfolder3}/subfolder1/book.txt > out$var

相关内容