为什么 ls 仍然显示通过 GLOBIGNORE 排除的文件?

为什么 ls 仍然显示通过 GLOBIGNORE 排除的文件?

文件丢失echo但存在ls -a。为什么?

bojan@hyperion:~$ touch .ignoramus
bojan@localhost:~$ ls -al | grep ignor
-rw-rw-r--  1 bojan bojan     0 Apr 19 19:05 .ignoramus
bojan@localhost:~$ GLOBIGNORE=".ignoramus";
bojan@localhost:~$ echo .i*
.icons
bojan@localhost:~$ ls -al | grep ignor
-rw-rw-r--  1 bojan bojan     0 Apr 19 19:05 .ignoramus
bojan@localhost:~$ echo $GLOBIGNORE
.ignoramus

ls 人说-a只显示隐藏,没有提到 GLOBIGNORE。

   -a, --all
          do not ignore entries starting with .

ls (GNU coreutils) 8.23
GNU bash, version 4.3.42(1)-release (x86_64-pc-linux-gnu)

答案1

设置GLOBIGNORE没有影响lsls说明书上也没有提到GLOBIGNORE,因为ls不关心GLOBIGNORE。它只是 bash 的一个功能,这使得它在 glob 模式中省略一些文件。

使用echo .i*, bash 正在列出文件,因此GLOBIGNORE启动。使用ls -a,ls正在列出文件,因此GLOBIGNORE无关紧要。

GNUls有类似的功能:您可以将要忽略的模式作为命令行选项传递。

ls -a -I .ignoramus

答案2

变量 GLOBIGNORE 是 bash 的一个功能,仅影响扩大文件。

换句话说:只有当使用 glob 时,GLOBIGNORE 才起作用。

glob 是带有字符 *、?、[...] 的“路径名扩展”的替代名称。

ls -al像或 simple 这样的命令ls不是 glob 的结果,因此不使用 GLOBIGNORE。

然而,像这样的命令ls -d *使用 glob 并且 GLOBIGNORE 有效。

设置(或取消设置)GLOBIGNORE 还可以通过其他两种方式影响“路径名扩展”:

GLOBIGNORE 已设置且不为空:

  1. 文件名... 始终被忽略。
  2. dotglob shell 选项已设置(以点开头的文件将匹配)。

取消设置 GLOBIGNORE

  1. 文件名.'' and..'' 不会被忽略。
  2. dotglob 选项被禁用。

相关内容