我目前正在尝试重现基本的Shell行为,尤其是重现Globing行为.
我在测试带有花括号的命令时,发现这种行为我不理解.
首先,我正在使用的目录的内容如下:
1abc 2abc 3abc abc1 abc2 abc3
然后,我键入以下命令:ls {[1-3],[a-c]} *,它按预期返回了上面的所有文件.
最后,我尝试了以下命令:ls {{,[1-3]},[a-c]} *,如您所见,它带有大括号.现在我不明白的是该命令的返回,因为它给了我:1abc 1abc 2abc 2abc 3abc 3abc abc1 abc1 abc1 abc2 abc2 abc3 abc3
如您所见,所有文件都被返回了两次,我无法弄清楚shell是如何解释这一点的.
希望我的解释清楚.
解决方法:
字符串{{,[1-3]},[a-c]} *是一个解释为brace expansion的表达式,由以下模式组成:
>“空”({,),
> [1-3],以及
> [a-c].
*字符(表示“给定目录中的每个文件名”)将应用于每个字符:
* => 1abc 2abc 3abc abc1 abc2 abc3
[1-3]* => 1abc 2abc 3abc
[a-c]* => abc1 abc2 abc3
嵌套表达式的事实并没有改变它只是这三种模式的列表的含义.使用更简单的表达式,例如{,[1-3],[a-c]} *,或使用另一个“列表列表”,例如{,{[1-3],[a-c]}} *,可以实现相同的效果.
如果您将表达式传递给echo,它将逐行打印上面各行中的所有字符:
$echo {{,[1-3]},[a-c]}*
1abc 2abc 3abc abc1 abc2 abc3 1abc 2abc 3abc abc1 abc2 abc3
但是ls默认情况下按字母顺序对条目进行排序:
$ls {{,[1-3]},[a-c]}*
1abc 1abc 2abc 2abc 3abc 3abc abc1 abc1 abc2 abc2 abc3 abc3
标签:bash,shell,glob,brace-expansion,linux
来源: https://codeday.me/bug/20191026/1936992.html