bash 不使用 $PATH 中的所有目录来搜索可执行文件

bash 不使用 $PATH 中的所有目录来搜索可执行文件

我认为,如果您在 bash 中调用一个命令,则会在 $PATH 中设置的所有目录中搜索该命令。

(以 root 身份运行)

$ clamscan ./
-bash: /usr/bin/clamscan: No such file or directory

/usr/bin/ 中没有 clamscan,但在 /usr/local/bin/ 中(如果我从那里调用它可以工作):

$ ls -hail /usr/local/bin/
62259565 drwxr-xr-x  2 root root 4.0K Jul 21 14:19 .
62259561 drwxr-xr-x 11 root root 4.0K Apr 11 19:55 ..
62260816 -rwxr-xr-x  1 root root 1.1K Jul 21 14:19 clamav-config
62260819 -rwxr-xr-x  1 root root  75K Jul 21 14:19 clambc
62260817 -rwxr-xr-x  1 root root  79K Jul 21 14:19 clamconf
62260821 -rwxr-xr-x  1 root root 141K Jul 21 14:19 clamdscan
62260823 -rwxr-xr-x  1 root root 137K Jul 21 14:19 clamdtop
62260822 -rwxr-xr-x  1 root root  95K Jul 21 14:19 clamscan
62260818 -rwxr-xr-x  1 root root 148K Jul 21 14:19 freshclam

我从未更改过 $PATH。目录 /usr/local/bin/ 已声明。

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

如果我将文件从 /usr/local/bin/ 复制到 /usr/bin/,它就可以工作,但我想知道为什么 bash 似乎只询问这个目录。

答案1

Bash 保留了查找缓存PATH。我推测您/usr/bin/clamscan在 Bash 实例的生命周期内删除了缓存,因此该文件仍存在于其缓存中。使用以下hash命令重建缓存:hash clamscan仅针对一个名称或hash -r清除缓存并重新开始。

相关内容