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


12

我试图在子文件夹中串联文本文件并尝试:

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

但是,这没有返回任何内容。因此,尝试添加一个不存在的“ subfolder2”

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

这次确实解决了,成功地将文件串联在一起。为什么会这样?


2
使用echo代替cat查看您得到的命令行。(或set -x用于调试。)
彼得·科德斯

Answers:


22

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

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

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

一些简单的示例:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2


1

大括号只有在逗号之间用逗号分隔的字符串(例如{abc,def}或范围,例如在{a..e}之间指定)时才会展开。

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

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

不幸的是,/path/{a,}/filename扩展为两个字符串/path/a/filename/path//filename,这可能是不必要的。
库萨兰达

感谢@Kusalananda纠正我,是的bash将提供警告说“歧义重定向”
Neo_Returns

不,ambiguous redirect 如果尝试重定向到由无值的无引号变量指定的文件(例如),则会得到提示echo 'hello' >$idontexist
库萨兰达

1
...或者如果重定向中的文件名扩展为多个单词。就像> *.txt有多个.txt文件,或者> $file如果$file包含空格。但是,当然,给出cat多个论点并没有歧义
-ilkkachu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.