我以为我理解了这一点,但我遇到了无法解释的行为。我有以下文件:
$ which -a kvm | xargs ls -l
lrwxrwxrwx 1 root root 18 2011-11-17 17:14 /usr/bin/kvm -> qemu-system-x86_64
lrwxrwxrwx 1 root root 18 2011-11-17 17:21 /usr/local/bin/kvm -> qemu-system-x86_64
$ which -a qemu-system-x86_64 | xargs ls -l
-rwxr-xr-x 1 root root 2535168 2011-10-04 02:44 /usr/bin/qemu-system-x86_64
-rwxr-xr-x 1 root root 3497304 2011-11-17 16:26 /usr/local/bin/qemu-system-x86_64
它们是不同的版本:
$ /usr/bin/kvm --version
QEMU PC emulator version 0.12.3 (qemu-kvm-0.12.3), Copyright (c) 2003-2008 Fabrice Bellard
$ /usr/local/bin/kvm --version
QEMU emulator version 0.15.92 (qemu-kvm-devel), Copyright (c) 2003-2008 Fabrice Bellard
我的路径是/usr/local/bin
first,当我这样做时,which
我看到了那个。所以我希望它获胜。但相反,旧版本获胜了:
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/var/lib/gems/1.8/bin
$ which kvm
/usr/local/bin/kvm
$ kvm --version
QEMU PC emulator version 0.12.3 (qemu-kvm-0.12.3), Copyright (c) 2003-2008 Fabrice Bellard
为什么kvm --version
给我 0.12 而不是 0.15???
答案1
在这种情况下,Linux 不会做出决定;它由您的 shell 提供确切的路径。当使用高级 shell 时,例如狂欢或者嘚,该which
工具并不准确,因为它只检查 $PATH,但还有其他几种可能性。运行type kvm
应该会告诉您 shell 在哪里寻找它。
“
hashed
”:第一次运行命令时,狂欢shell 会记住其位置,这样就不必再次搜索整个 $PATH。记住的位置仅保存在内存中。使用hash
列出它们并hash -r
重置,或者只是启动第二个 shell 窗口。“
alias
”:您可能创建了一个kvm
指向旧路径的别名“”。如果是这种情况,请使用unalias kvm
删除该别名。“
function
”:与别名类似,但更具表现力。同样,您可能添加并忘记了kvm
指向错误路径的函数名称。使用unset kvm
删除此类函数。
答案2
您可以通过声明别名来覆盖 PATH 搜索
alias kvm=/sbin/kvm
尝试type -a kvm
我为日期创建了一个别名
$ which -a date
/usr/local/bin/date
/bin/date
$ type -a date
date is aliased to `/bin/date'
date is /usr/local/bin/date
date is /bin/date