为什么 bash 在 /usr/bin 中寻找 vim

为什么 bash 在 /usr/bin 中寻找 vim

我正在使用 Ubuntu 14.04

我编译了 vim 并安装在 /usr/local/bin 中

我卸载了安装的早期版本的 vim。

为什么 bash 在 中寻找 vim /usr/bin

vimal@Tardis:~/VIM/vim$ which -a vim
/usr/local/bin/vim
vimal@Tardis:~/VIM/vim$ vim
bash: /usr/bin/vim: No such file or directory

vimal@Tardis:~/VIM/vim$ ls -al /usr/local/bin/
total 3216
drwxr-xr-x  2 root root    4096 Aug 10 11:39 .
drwxr-xr-x 11 root root    4096 Aug  9 11:51 ..
-rwxr-xr-x  1 root root  972502 Aug  9 12:33 ctags
lrwxrwxrwx  1 root root       3 Aug  9 22:24 ex -> vim
lrwxrwxrwx  1 root root       3 Aug  9 22:24 rview -> vim
lrwxrwxrwx  1 root root       3 Aug  9 22:24 rvim -> vim
lrwxrwxrwx  1 root root       3 Aug  9 22:24 view -> vim
-rwxr-xr-x  1 root root 2284512 Aug 10 11:39 vim
lrwxrwxrwx  1 root root       3 Aug  9 22:24 vimdiff -> vim
-rwxr-xr-x  1 root root    2084 Aug 10 11:39 vimtutor
-rwxr-xr-x  1 root root   18896 Aug 10 11:39 xxd
vimal@Tardis:~/VIM/vim$ id
uid=1001(vimal) gid=1001(vimal) groups=1001(vimal),4(adm),27(sudo),108(lpadmin),124(sambashare)
vimal@Tardis:~/VIM/vim$ echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/go/bin:/home/vimal/gowork/bin

答案1

引用bash手册:

Bash 使用哈希表来记住可执行文件的完整路径名。仅当在哈希表中找不到命令时,才会对 PATH 中的目录进行完整搜索。

此时,发生的事情是:

  1. 删除了原来的/usr/bin/vim,并且
  2. 创建了一个新的/usr/local/bin/vim

在这种情况下,bash的路径哈希表从未更新过,因此当您vim在 1 和 2 之后调用时,它会找到旧的哈希路径。要强制更新路径哈希,请使用hash -r

AFAICTbash有一个奇怪且未记录的行为,即:

如果你打电话vim 之间1 和 2(导致合法的“未找到命令”),则散列路径为自动移除,因此当您vim在 2 之后再次调用时,它就可以正常工作。

我不明白的是,为什么在 1 和 2 之后调用bash时不会自动删除路径(如您的情况),并且会找到错误的路径。但这就是正在发生的事情。vim

相关内容