gpt4 book ai didi

linux - 如何在 shell 中使用花括号 (bash)

转载 作者:太空狗 更新时间:2023-10-29 11:03:33 25 4
gpt4 key购买 nike

我目前正在尝试重现基本的 shell 行为,更具体地说是 globbing 行为。我正在测试其中带有花括号的命令,发现了这种我不理解的行为。首先,我正在使用的目录的内容如下:

1abc 2abc 3abc abc1 abc2 abc3

然后,我输入以下命令:ls {[1-3],[a-c]}*,它按预期返回了上面的所有文件。

最后,我尝试了这个命令:ls {{,[1-3]},[a-c]}*,如您所见,它有叠层花括号。现在我不明白的是这个命令的返回,因为它给了我这个:1abc 1abc 2abc 2abc 3abc 3abc 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

关于linux - 如何在 shell 中使用花括号 (bash),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40719408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com