Linux 如何决定我要运行哪个可执行文件?

Linux 如何决定我要运行哪个可执行文件?

我以为我理解了这一点,但我遇到了无法解释的行为。我有以下文件:

$ 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/binfirst,当我这样做时,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

相关内容