定位命令和 shell 的通配符

Num*_*945 3 command-line bash locate

定位手册页

If --regex is not specified, PATTERNs can contain globbing characters. If any PATTERN contains no globbing characters, locate behaves as if the pattern were *PATTERN*.
Run Code Online (Sandbox Code Playgroud)

现在,查看这些命令的输出:

test@ubuntu:~$ ls
Desktop  Documents  Downloads  Firefox_wallpaper.png  Music  Pictures  Public  Templates  Videos
test@ubuntu:~$ 
test@ubuntu:~$ 
test@ubuntu:~$ locate '/bin/bash*'
test@ubuntu:~$ 
test@ubuntu:~$ 
test@ubuntu:~$ locate /bin/bash*
/snap/core18/1880/bin/bash
/snap/core18/1880/usr/bin/bashbug
/snap/core18/1944/bin/bash
/snap/core18/1944/usr/bin/bashbug
/usr/bin/bash
/usr/bin/bashbug
Run Code Online (Sandbox Code Playgroud)

如果您看到我当前的工作目录没有完整路径名以/bin/bash. 因此,我们不应该从locate /bin/bash*. 为什么 ?根据shell 的 globbing 功能,由于我当前的工作目录中没有这样的文件/目录,因此*不会按原样扩展和传递。因此,它应该等同于 using locate '/bin/bash*'(这是我们上面运行的第二个命令)。因为,这没有收到任何输出,因此这locate /bin/bash*也不应该给出输出?

ste*_*ver 5

如果您看到我当前的工作目录没有完整路径名以 /bin/bash 开头的文件/目录。因此,我们不应该从 locate /bin/bash* 接收任何输出

不,这不是 shell globbing 的工作方式 -/bin/bash*匹配包括路径,所以鉴于它找到了一个匹配(即/bin/bash),这就是locate将接收的参数。您可以通过使用 shell 的-x调试参数集运行命令来验证这一点:

$ set -x
$ 
$ locate /bin/bash*
+ locate /bin/bash
/bin/bash
/snap/core/10577/bin/bash
/snap/core/10577/usr/bin/bashbug
/snap/core/10583/bin/bash
/snap/core/10583/usr/bin/bashbug
/snap/core18/1932/bin/bash
/snap/core18/1932/usr/bin/bashbug
/snap/core18/1944/bin/bash
/snap/core18/1944/usr/bin/bashbug
/usr/bin/bashbug
Run Code Online (Sandbox Code Playgroud)

由于(扩展的)模式不包含通配符,它​​等效于*/bin/bash*.

更有趣的问题是为什么它没有定位/bin/bash自己,因为 shell 显然可以定位 - 我认为这是因为/bin/usr/bin在较新版本的 Ubuntuupdatedb上被符号链接- 并且不记录符号链接。