以下哪一个路径具有优先级:/usr 或 /usr/local

以下哪一个路径具有优先级:/usr 或 /usr/local

我想aria2c通过将其复制到手动安装,/usr/local/bin因为我使用 apt 安装了 aria2c/usr/bin

如果我输入其中哪一个将被执行aria2c

答案1

将执行的可执行文件取决于变量中目录的顺序PATH

如果/usr/bin之前列出/usr/local/bin/usr/bin/aria2c则将执行 then 而不是/usr/local/bin/aria2c.

如果您的 shell 对可执行文件进行哈希处理,并且在您在 中安装相同的实用程序之前aria2c它已经访问过,那么它可能会选择无论 中目录的顺序如何。请注意,这种情况可能仅发生在您使用该实用程序,然后将其安装在另一个位置,然后尝试在同一 shell 会话中再次使用它的特定情况下。该命令将清除 shell 会话中记住的实用程序位置。也可以看看/usr/bin/usr/local/bin/usr/bin/aria2cPATHhash -r如何清除 Bash 的可执行文件路径缓存?

如果您有一个名为 的别名或 shell 函数aria2c,那么将在 shell 使用它PATH来定位可执行文件之前使用它。


在我的个人(非 Linux)系统上:

$ printf '%s\n' "$PATH" | tr ':' '\n'
/usr/bin
/bin
/usr/sbin
/sbin
/usr/X11R6/bin
/usr/local/bin
/usr/local/sbin
/usr/games

正如您所看到的,在我的系统上/usr/local/bin已经很晚了。/usr/bin我已经这样设置了避免意外地覆盖了/usr/bin.如果您想让本地可执行文件优先于/usr/bin.

答案2

很奇怪我在这个 SE 网站上找不到答案。

这取决于您的 shell,但通常有一个PATH环境变量,其中包含 shell 正在检查以便执行命令的目录。这些目录用分号分隔:

$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/wine/bin:/home/birdie/bin

二进制文件是从左到右搜索的,即在我的示例中,如果我有相同的二进制文件/usr/local/bin,则/bin来自的二进制文件/usr/local/bin将优先。

同时,如果您的 shell 有别名,则支持的函数将首先执行(如果定义了别名)。您可以通过运行alias和来查看它们set。还有另一个类别built-in命令。所以顺序是:

  • 别名
  • 功能
  • 内置命令
  • $PATH从左到右查找的二进制文件

最后,值得注意的是:别名不是在 shell 脚本中工作(未定义)。

答案3

更简单的解决方案是使用which来查看将要执行的程序。

联机帮助页...

它将在 shell 提示符下输入此参数时将执行的可执行文件的完整路径打印到标准输出。

例子:

[~] echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/lib/llvm/13/bin:/usr/lib/llvm/12/bin
[~] echo '#!/bin/bash' > hello_world.sh
[~] echo 'echo "Hello World"' >> hello_world.sh
[~] chmod 755 hello_world.sh 
[~] sudo cp hello_world.sh /bin/
[~] sudo cp hello_world.sh /usr/bin/
[~] sudo cp hello_world.sh /usr/local/bin/
[~] which hello_world.sh
/usr/local/bin/hello_world.sh

添加

它引起了我的注意,它hash可以改变命令的执行方式。但在大多数情况下,程序不会因性能提升而被散列。我的哈希列表始终只有两个命令。

[~] hash
hits    command
   3    /usr/bin/man
   1    /bin/bash

只要您不散列命令,该which命令就应该没问题。或者你用它来type -p hello_world.sh代替。该命令是类似type的一部分。我认为他们会以某种方式相互沟通。bashhash

要保存,您可以调用hash不带任何参数的命令来查看所有哈希程序。

相关内容