Unix缓存二进制文件?

Qui*_*ype 7 unix linux shell

这是我的理解问题,我相信*nix系统很少需要重启.即如果您安装了新的"应用程序"甚至是内核9/10,则无需重新启动.

我最近安装了一个随机组件(liquidsoap依赖)我需要从source:camlp4-4.03-1并注意到以下内容:

pi@raspberrypi:~ $ /usr/local/bin/camlp4 -v
Camlp4 version 4.03.0
pi@raspberrypi:~ $ camlp4 -v
Camlp4 version 4.01.0
pi@raspberrypi:~ $ which camlp4
/usr/local/bin/camlp4
Run Code Online (Sandbox Code Playgroud)

我对版本不匹配感到难过?对于看似相同的文件?目前的目录中没有"camlp4":)

HW: Raspberry Pi 3
OS: Raspbian Jessie (up to date)
Run Code Online (Sandbox Code Playgroud)


要求提供的信息:

pi@raspberrypi:~ $ find / -name camlp4
/usr/local/lib/ocaml/site-lib/camlp4
/usr/local/lib/ocaml/camlp4
/usr/local/bin/camlp4
/usr/lib/ocaml/camlp4
/usr/share/doc/camlp4
/usr/bin/camlp4
/home/pi/apps/camlp4
/home/pi/apps/camlp4/camlp4-4.03-1/_build/camlp4
/home/pi/apps/camlp4/camlp4-4.03-1/camlp4
/home/pi/apps/ocamlfind/findlib-1.6.2/site-lib-src/camlp4

pi@raspberrypi:~ $ type -a camlp4
camlp4 is /usr/local/bin/camlp4
camlp4 is /usr/bin/camlp4

pi@raspberrypi:~ $ which camlp4
/usr/local/bin/camlp4
pi@raspberrypi:~ $ /usr/bin/camlp4 -v
Camlp4 version 4.01.0
pi@raspberrypi:~ $ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
Run Code Online (Sandbox Code Playgroud)

测试解决方案:

pi@raspberrypi:~ $ /usr/local/bin/camlp4 -v
Camlp4 version 4.03.0
pi@raspberrypi:~ $ camlp4 -v
Camlp4 version 4.01.0
pi@raspberrypi:~ $ which camlp4
/usr/local/bin/camlp4
pi@raspberrypi:~ $ hash -r
pi@raspberrypi:~ $ camlp4 -v
Camlp4 version 4.03.0
Run Code Online (Sandbox Code Playgroud)

Vir*_*ile 5

大多数shell确实维护了二进制文件的缓存,以便为给定的命令启动,以避免PATH每次搜索,并且which不知道这个缓存,这解释了您正在观察的差异.刷新缓存的方式因shell而异.对于bashdash,您应该这样做hash camlp4.因为zsh,这是rehash.

  • 符合POSIX标准的清除哈希的方法是[`hash -r`](http://pubs.opengroup.org/onlinepubs/009696799/utilities/hash.html).它应该适用于所有或多或少的POSIX兼容shell,包括zsh. (5认同)