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
.
很奇怪我在这个 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 脚本中不起作用(未定义)。