Pat*_*nan 3 macos bash path ctags osx-mavericks
我想使用旺盛的ctags.但是,在OS X 10.9上,默认似乎是调用不同的二进制文件,
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ctags
我可以很容易地从MacPorts获得丰富的ctags
sudo port install ctags
,我的路径似乎设置正确,允许使用新的二进制文件/opt/local/bin(我的路径中的第一个位置)
$ which ctags
/opt/local/bin/ctags
Run Code Online (Sandbox Code Playgroud)
但是,执行ctags仍然调用里面的版本XCode.app.我当然可以使用
which ctags
并使用其完整路径调用正确的二进制文件,但我很困惑为什么路径似乎没有像它应该的那样工作.
为什么which在这种情况下实际上没有指定将执行哪个二进制文件的结果?
更新:启动新的bash shell解决了该问题.据推测,可执行文件的名称已缓存在某个地方,但我怎样才能防止将来发生这种情况?
您无法阻止 shell缓存命令的位置; 这通常是出于性能原因而完成的.但是,您可以强制shell根据需要刷新此缓存.使用bash此hash命令可用于操作此命令缓存.运行:
hash mycommand
Run Code Online (Sandbox Code Playgroud)
将导致shell更新存储的位置mycommand.例如,如果我的$PATH开头是:
$HOME/bin/A:$HOME/bin/B
Run Code Online (Sandbox Code Playgroud)
我mycommand在$ HOME/bin/B中输入了一个卖出的脚本:
#!/bin/sh
echo This is B.
Run Code Online (Sandbox Code Playgroud)
然后跑mycommand,我得到:
$ mycommand
This is B.
Run Code Online (Sandbox Code Playgroud)
如果我然后在以下位置创建同名脚本$HOME/bin/A:
#!/bin/sh
echo This is A.
Run Code Online (Sandbox Code Playgroud)
然后运行mycommand,我们看到bash使用缓存的位置:
$ mycommand
This is B.
Run Code Online (Sandbox Code Playgroud)
如果我然后使用该hash命令,我们会看到bash更新位置:
$ hash mycommand
$ mycommand
This is A.
Run Code Online (Sandbox Code Playgroud)
更改PATH环境变量也会导致bash忘记二进制文件的缓存位置.