为什么Linuxshell中带大括号的`{cat,filename}`Group命令可以工作?

我正在学习 Linux 。现在正在阅读组命令

当前 shell 中的组命令:{}

{ list; }
{ list; }

更多在https://ss64.com/bash/syntax-brackets.html

列表后面的分号(或换行符)是必需的。大括号是保留字,因此必须用空格将它们与列表分开。

但是当我在我的Ubuntu像测试{cat,2.txt}{ls,-l}

这两个命令不由空格分隔,分号也不在列表后面。但是当我按照报价进行操作时,壳牌告诉我command not found

highway@ubuntu:~/Desktop$ { ls,-l; }
ls,-l: command not found
highway@ubuntu:~/Desktop$ { cat,2.txt; }
cat,2.txt: command not found

在接下来的测试中,我发现只有在非元字符中,才能成功。

highway@ubuntu:~/Desktop$ {cat,2.txt}
This is test2!

highway@ubuntu:~/Desktop$ {ls,-l}
total 12692
-rw-rw-r-- 1 highway highway       15 Jul  2 16:49 2.txt
...

所以我想知道2个问题

  1. 为什么{cat,2.txt}不用分号也可以不用空格隔开?
    换句话说,为什么命令{cat,filename}会被 shell 正确解析?
  2. 为什么只有在非元字符中,才能成功?
    换句话说,为什么,特别?

回答

TL;DR 大括号也可以引入大括号扩展,它们是单独处理的。


{cat,ls}不是指挥组;这是一个大括号扩展。解析器可以分辨出来,因为这是一个单一的开头字{,不带字的命令{在命令位置。

逗号的存在还表明这是大括号扩展,而不是像{cat.2.txt}.

{ cat.2.txt }将是一个命令组,命令cat.2.txt接收参数};该组本身还没有被}出现在指挥位置上关闭。

{cat,ls}扩展时,它会扩展到两个单词catand ls然后cat其识别为命令及其参数ls


以上是为什么Linuxshell中带大括号的`{cat,filename}`Group命令可以工作?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>