有人可以解释一下这是如何工作的吗?我只是不明白内置 echo 命令如何与目录列表交互。
bash-5.2$ ls
2 file000 file003 file006 file009 file012 file015 file018 file021 file024 file027 h
5 file001 file004 file007 file010 file013 file016 file019 file022 file025 file028 ola
8 file002 file005 file008 file011 file014 file017 file020 file023 file026 file029 q
bash-5.2$ echo [0-9a-z]
2 5 8 h q
谢谢。
答案1
这与 无关echo
,echo
只是打印它接收到的参数,以空格分隔并以换行符终止(在一些潜在的选项处理和反斜杠转义处理之后)。
你这里看到的是shell的效果通配,又名文件名生成又名路径名扩展,因此,在列表上下文中,如果某些单词包含一些未加引号的通配模式运算符,其中包括*
,?
和 (除了fish
),[...]
(并且可能更多,具体取决于 shell),则该单词将被扩展通过外壳到目录树中的匹配文件列表。
无论命令如何,无论是echo
、rm
、firefox
...
您可能会在以下内容中看到过它:
rm -- *.txt
在那里,它*
触发了行为。
在:
echo [0-9a-z]
正是[...]
它触发了它。作为一种模式,匹配介于 和 之间或介于1和之间[0-9a-z]
的任何一个字符,因此作为通配符,该单词将扩展到当前工作目录中与该模式匹配的所有单字符文件名。0
9
a
z
[0-9a-z]
并将rm -- [0-9a-z]
删除它们、vi -- [0-9a-z]
编辑它们等等。
重要的提示:命令,无论是rm
, echo
, vi
... 只看到扩展的结果(作为单独的参数),而不是模式。特别是,如果该扩展中的第一个 ² 文件名以-
³ 开头,则它可能会被视为可能产生灾难性影响的选项,因此,就像在 中一样cmd -- $files
,重要的是不要忘记--
⁴。
¹ 其中包括诸如您的2
, 5
, 8
,之类的字符h
,q
但也经常(并且经常被忽视)诸如²
, DŽ
,