为什么“ls *bash*”不显示 .bashrc 文件

为什么“ls *bash*”不显示 .bashrc 文件

我 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 中以使其始终有效。

相关内容