为什么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个问题
- 为什么
{cat,2.txt}不用分号也可以不用空格隔开?
换句话说,为什么命令{cat,filename}会被 shell 正确解析? - 为什么只有在非元字符中
,才能成功?
换句话说,为什么,特别?
回答
TL;DR 大括号也可以引入大括号扩展,它们是单独处理的。
{cat,ls}不是指挥组;这是一个大括号扩展。解析器可以分辨出来,因为这是一个单一的开头字{,不带字的命令{在命令位置。
逗号的存在还表明这是大括号扩展,而不是像{cat.2.txt}.
{ cat.2.txt }将是一个命令组,命令cat.2.txt接收参数};该组本身还没有被}出现在指挥位置上关闭。
当{cat,ls}扩展时,它会扩展到两个单词catand ls,然后将cat其识别为命令及其参数ls。
THE END
二维码