我 cd 到我的主目录并输入
ls *bash*
期望它会显示包含“bash”的文件列表。然而事实并非如此。
同时,打字
ls .bash*
作品。
根据文档,*
代表任何字符,对吧?但.
在本案中似乎并不代表这一点。怎么了?
答案1
shelldotglob
选项控制这一点:
$ shopt -s dotglob
$ ls *bash*
.bash_history .bash_logout .bashrc
默认情况下不启用它,可能是作为一种可用性/安全措施,因为大多数最终用户不必担心点文件,并且可能很容易意外删除关键的主目录文件(例如.config
,.ssh
)。
答案2
大多数 shell 不会使“*”字符与开头的“.”匹配。出于历史原因的字符(例如以“.”开头的文件被视为隐藏,“.”和“..”指目录)
因此ls
不会显示 .bashrc ,但ls -a
会显示所有文件。同样,ls *
将扩展到除以“.”开头的文件之外的所有文件。特点。
更改此行为,shopt -s dotglob
告知 bash“*”也必须与开头的“.”字符匹配。此后,ls *
也会显示 .bashrc。
答案3
原因是前导点是“隐藏文件”的约定,而文件通配符(这是使用*
“任意数量的任意字符”和?
“任意一个字符”以及其他一些字符的名称)明确排除前导点,因为它意味着“隐藏文件”。
如果您编写,ls -l .*
您将匹配.bashrc
,但您还将匹配特殊的隐藏文件.
和..
目录,因此要显示隐藏文件,您将需要以下内容:
ls -ld .*
ls -l .[^.]*
ls -A | grep bash
ls -A *bash*
不会显示,.bashrc
因为文件匹配是在该-A
选项生效之前完成的。
如果您想更改文件通配符处理隐藏文件的方式,您可以执行shopt -s dotglob
,要么只是在 shell 中进行测试,要么放入您的 .bash_profile 或 .bashrc 中以使其始终有效。