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

moh*_*tux 12 shell path environment-variables

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

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

Kus*_*nda 23

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

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

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

如果您有一个名为 的别名或 shell 函数,那么将在 shell 使用它来定位可执行文件aria2c之前使用它。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
Run Code Online (Sandbox Code Playgroud)

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

  • +1 专门用于调用“hash -r”! (2认同)

Art*_*nov 4

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

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

$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/wine/bin:/home/birdie/bin
Run Code Online (Sandbox Code Playgroud)

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

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

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

最后,值得注意并记住:别名在 shell 脚本中不起作用未定义)。

  • @waltinator我不会起诉您正在谈论的 shell 初始化文件,也不会起诉您为什么特别提到“bash”,但您会注意到,即使定义了别名,在非交互式 shell 中也不会替换别名。它与你的`.bashrc`检查`$-`关系不大。 (3认同)