当只有一个元素时大括号不起作用

当只有一个元素时大括号不起作用

我能够根据扩展名来 scp 文件,

 scp sk@localhost:/home/sk/*.{txt,text} .

但是当我尝试 scp 单个扩展类型时,它失败了,

 scp sk@localhost:/home/sk/*.{txt} .

我可以通过删除案例#2中的花括号来解决此错误,

我只是好奇为什么使用花括号会失败,因为只有文件扩展名类型。

答案1

假设你正在使用 bash,文档说:

格式正确的大括号扩展必须包含不带引号的左大括号和右大括号,以及至少一个不带引号的逗号或有效的序列表达式。任何错误形成的大括号扩展都保持不变。

因此,{foo}这不是一个正确形成的大括号扩展:

$ bash -c 'echo {foo} {foo,bar}'
{foo} foo bar

答案2

您所说的“花括号”通常称为“大括号”,您使用的功能称为“大括号扩展”。 bash 手册页这样记录它:

   支撑扩张
       大括号扩展是一种可以生成任意字符串的机制。
       这种机制类似于路径名扩展,但文件名生成
       已不需要存在。要展开大括号的模式采用以下形式
       可选的前导码,后跟一系列逗号分隔的字符串
       或一对大括号之间的序列表达式,后跟可选的
       后记。前导码是包含在每个字符串的前缀
       大括号,然后将附言附加到每个结果字符串中,
       从左向右扩展。

当您仅在大括号中放置单个扩展时,它不是大括号扩展,因为它与列出的任何格式都不匹配(逗号分隔的字符串或一对大括号之间的序列表达式)。因此,它没有扩展,而是保持不变。

相关内容