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

Rob*_*tin 2 linux path

我以为我明白这一点,但我得到了无法解释的行为。我有这些文件:

$ 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
Run Code Online (Sandbox Code Playgroud)

它们是不同的版本:

$ /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
Run Code Online (Sandbox Code Playgroud)

我的路径是/usr/local/bin第一个,当我这样做时,我会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
Run Code Online (Sandbox Code Playgroud)

为什么kvm --version给我 0.12 而不是 0.15???

use*_*686 7

在这种情况下,Linux 不做决定;它由您的 shell 提供了确切的路径。使用bashzsh等高级 shell 时,该which工具不准确,因为它只检查 $PATH,但还有更多可能性。运行type kvm应该告诉你 shell 在哪里寻找它。

  • " hashed":第一次运行命令时,bash shell 会记住它的位置,这样它就不必再次搜索整个 $PATH。记住的位置只保存在内存中。使用 hash列出他们和hash -r复位,或简单地启动第二个shell窗口。

  • alias”:您可能创建了一个kvm指向旧路径的别名“ ”。如果是这种情况,请使用 unalias kvm删除别名。

  • " function":类似于别名,但更具表现力。同样,您可能已经添加并忘记了一个名为kvm指向错误路径的函数。使用 unset kvm删除这样的功能。