2016-11-21 75 views
2

我目前正在尝试重现基本的shell行为,更具体地说是globbing行为。 我正在用花括号测试命令,并发现这种行为,我不明白。 首先,我的工作目录的内容如下:如何在shell中使用大括号(bash)

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

字符串{{,[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 
    
  • +0

    好,非常感谢这个解释,它非常清晰,现在我明白了! –

    2

    击在第一步骤(括号膨胀)到

    * [1-3]* [a-c]* 
    

    膨胀

    {{,[1-3]},[a-c]}* 
    

    在第二步骤(通配符)的bash膨胀*的所有文件[1-3]*到开头的所有文件1,23扩大[a-c]*a,bc开头的所有文件。