当寻找的路径,可执行文件或检查,如果你在Unix shell中输入命令的名称会发生什么,有不同的公用事业过多(which,type,command,whence,where,whereis,whatis,hash,等)。
我们经常听说which应该避免。为什么?我们应该用什么来代替?
当我在没有指定可执行文件的完整路径的情况下执行程序时,Bash 必须搜索其中的目录$PATH才能找到二进制文件,似乎 Bash 会记住某种缓存中的路径。例如,我安装了从源代码到 的 Subversion 版本/usr/local,然后svnsync help在 Bash 提示符下键入。Bash 找到了/usr/local/bin/svnsync“svnsync”的二进制文件并执行了它。然后当我删除 Subversion 中的安装/usr/local并重新运行时svnsync help,Bash 响应:
bash: /usr/local/bin/svnsync: No such file or directory
Run Code Online (Sandbox Code Playgroud)
但是,当我启动一个新的 Bash 实例时,它会找到并执行/usr/bin/svnsync.
如何清除可执行文件路径的缓存?
我的路上有一个程序。程序在使用指定的完整路径执行时运行。但是当我只用它的名字运行它时,找不到该程序。
本质上,我想了解以下输出是如何可能的,以及如何修复它,以便在没有指定完整路径的情况下实际上可以找到我的程序:
root:/usr/local/bin# ./siege
****************************************************
siege: could not open /usr/local/bin/etc/siegerc
run 'siege.config' to generate a new .siegerc file
****************************************************
root:/usr/local/bin# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
root:/usr/local/bin# siege
bash: /usr/bin/siege: No such file or directory
root:/usr/local/bin# wtf!?!?
Run Code Online (Sandbox Code Playgroud)
我在 Ubuntu 12.04 上使用 bash。另请注意,siege 的警告输出与此问题的目的无关,因为我只对是否可以找到并调用该程序感兴趣。
我安装parcellite在 Ubuntu(从http://parcellite.sourceforge.net/下载)
从源代码安装后sudo make install,我可以看到它安装在以下位置。
但是,当我尝试运行它时,它会尝试从另一条路径运行它。这是为什么?
user$ which parcellite
/usr/local/bin/parcellite
user$ parcellite -h
bash: /usr/bin/parcellite: No such file or directory
Run Code Online (Sandbox Code Playgroud)
$PATH 如下
/home/user/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
我尝试如下更改可执行文件的所有权。问题仍然存在。
user$ ls -l /usr/local/bin/parcellite
-rwxr-xr-x 1 root root 452K Oct 7 21:00 /usr/local/bin/parcellite
user$sudo chown user:user /usr/local/bin/parcellite
user$ ls -l /usr/local/bin/parcellite
-rwxr-xr-x 1 user user 452K Oct 7 21:01 /usr/local/bin/parcellite
Run Code Online (Sandbox Code Playgroud)
我安装了旧版本的parcellite。但我在安装新版本之前将其删除。
更新:@Fox 的解决方案有效。但是知道为什么which命令给出了正确的路径,尽管hash没有更新?
bash ×3
path ×2
cache ×1
executable ×1
gnome-shell ×1
history ×1
parcellite ×1
portability ×1
shell ×1
ubuntu ×1
which ×1