当我在学习 Linux 命令时,我注意到“grep”命令有这种奇怪的异常行为。在目录中/usr/bin
,当我运行:
me@me-desktop:/usr/bin$ ls -l | grep bashb*
-rwxr-xr-x 1 root root 6988 Mar 31 2024 bashbug
这是意料之中的,但如果我在外面做同样的事情/usr/bin
me@me-desktop:~/Code/linux$ ls -l /usr/bin | grep bashb*
-rwxr-xr-x 1 root root 1446024 Mar 31 2024 bash
-rwxr-xr-x 1 root root 6988 Mar 31 2024 bashbug
-rwxr-xr-x 1 root root 4527 Apr 17 2023 dh_bash-completion
lrwxrwxrwx 1 root root 4 Aug 20 23:14 rbash -> bash
正如您所看到的,它现在可以选择忽略最后b
一个bashb
。
这种情况也发生在许多其他情况下。例如,如果您这样做apt list | grep lib*
,那么它也会列出带有的li
。
在您的第一个命令中,
bashb*
shell 会在传递给 grep 之前对其进行扩展。这是因为您当前的目录包含与扩展匹配的文件。因此,启动的最后一个命令是:在第二个命令中,您没有 maching 文件
~/Code/linux
。因此,bash 不会扩展参数并将其直接传递给 grep:为了在任何情况下避免这种扩展,您可以将参数括在单引号中:
bashb*
进行通配符ls -l | grep bashb*
匹配文件bashbug
。grep
实际上当当前目录不包含匹配的文件时,
bashb*
按原样使用,这也是错误的,因为它将匹配bash
其中任何位置的任何文件及其名称,后跟 0 个或多个b
。请注意,通配符和正则表达式遵循不同的规则。
bashb*
在 globbing 中意味着一个文件以 开头bashb
,然后其后可以有任意数量的字符。bashb*
在正则表达式中匹配bash
字符串中的任何位置,b*
意味着字符b
0 次或更多次。foobashbbbbbar
例如将匹配。grep
在输出中ls
通常不是一个好主意。