我知道通配符在运行命令之前被 shell 扩展,它们是 shell 的一个特性。通配符也适用于那些可以接受许多参数的命令。在find . -name *.rb 我们若在当前目录多个文件find会给我们一个错误,因为发现不能接受多个参数,解决这个是方法:
find . -name "*.rb"
find . -name '*.rb'
find . -name \*.rb
Run Code Online (Sandbox Code Playgroud)
我们避开星号并防止 shell 扩展,但通配符是 shell 的一个特性;当我们转义 asterisk shell 不知道它的含义时,它应该找到一个名为 的文件*.rb,那么在这种情况下星号是如何扩展的?
从定位手册页:
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*也不应该给出输出?