/usr/local/bin 中的二进制文件

3 linux path

我查看命令所在的位置:

xxx:~/mono/mono-2.6.7$ which mono
/usr/local/bin/mono
Run Code Online (Sandbox Code Playgroud)

如果我直接执行它,没问题:

xxx:~/mono/mono-2.6.7$ /usr/local/bin/mono -V
Mono JIT compiler version 2.6.7 (tarball Mon Aug  2 16:01:50 UTC 2010)
Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com
....
Run Code Online (Sandbox Code Playgroud)

但是如果我在没有路径的情况下执行命令,它就找不到它:

xxx:~/mono/mono-2.6.7$ mono
bash: /usr/bin/mono: No such file or directory
Run Code Online (Sandbox Code Playgroud)

/usr/bin 中没有单声道文件:

xxx:~/mono/mono-2.6.7$ ls -l /usr/bin/mono
ls: cannot access /usr/bin/mono: No such file or directory
Run Code Online (Sandbox Code Playgroud)

这是我的路径:

xxx:~/mono/mono-2.6.7$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Run Code Online (Sandbox Code Playgroud)

它不是搜索由冒号分隔的每个目录吗?那么它不应该在 /usr/local/bin 中找到 mono 吗?

如果我以 root 身份登录,它就可以工作。我可以在命令行上执行 mono 并找到它。权限是:

xxx:~/mono/mono-2.6.7$ ls -l /usr/local/bin/mono
-rwxr-xr-x 1 root root 8452592 2010-08-02 16:23 /usr/local/bin/mono
Run Code Online (Sandbox Code Playgroud)

我使用的用户不属于正确的组吗?

Gil*_*il' 7

Bash 将命令位置的缓存保存在内存中,这样它就不必在每次启动命令时都进行整个 PATH 探索。在你原来的bash会议,庆典以前记住这mono/usr/bin/mono。然后您删除/usr/bin/mono并添加了/usr/local/bin/mono,但是您正在运行的 bash 在其缓存中仍然具有旧位置。

您可以使用hash内置命令操作命令位置缓存。特别是hash -r清除缓存。

which是一个外部命令,所以它不使用 bash 的缓存并且每次都执行 PATH 查找。您也可以使用type,它是一个内置函数,因此确实使用了查找缓存。