从OS X命令行调用的ctags不正确

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解决了该问题.据推测,可执行文件的名称已缓存在某个地方,但我怎样才能防止将来发生这种情况?

lar*_*sks 8

您无法阻止 shell缓存命令的位置; 这通常是出于性能原因而完成的.但是,您可以强制shell根据需要刷新此缓存.使用bashhash命令可用于操作此命令缓存.运行:

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忘记二进制文件的缓存位置.