我想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/aria2c
PATH
hash -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
的一部分。我认为他们会以某种方式相互沟通。bash
hash
要保存,您可以调用hash
不带任何参数的命令来查看所有哈希程序。