文件丢失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
没有影响ls
,ls
说明书上也没有提到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 已设置且不为空:
- 文件名
.
和..
始终被忽略。 - dotglob shell 选项已设置(以点开头的文件将匹配)。
取消设置 GLOBIGNORE
- 文件名
.'' and
..'' 不会被忽略。 - dotglob 选项被禁用。