为什么 Bash 为我的 PATH 中的程序提供“没有这样的文件或目录”?

Bor*_*itz 6 linux bash path

docker-compose按照https://docs.docker.com/compose/install/上的说明安装在我的 Ubuntu 16.04 机器上,用于curl将二进制文件直接下载到/usr/local/bin/

$ ls -lh /usr/local/bin/docker-compose 
-rwxr-xr-x 1 root root 16M Jul 11 15:55 /usr/local/bin/docker-compose
Run Code Online (Sandbox Code Playgroud)

/usr/local/bin/ 在我的路径中:

$ echo $PATH
/home/me/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Run Code Online (Sandbox Code Playgroud)

请注意,它/usr/bin实际上是在 之前。

当我尝试检查它的版本时,我得到了一个与 PATH 相关的错误:

$ docker-compose --version
bash: /usr/bin/docker-compose: No such file or directory
Run Code Online (Sandbox Code Playgroud)

通过指定可执行文件的完整路径,我得到了正确的行为,

$ /usr/local/bin/docker-compose --version
Run Code Online (Sandbox Code Playgroud)

docker-compose 版本 1.24.0,构建 0aa59064

或通过使用sudo

$ sudo docker-compose --version
docker-compose version 1.24.0, build 0aa59064
Run Code Online (Sandbox Code Playgroud)

为什么我不能跑$ docker-compose --version?为什么 Bash 会/usr/bin特别抱怨,什么时候它应该在/usr/local/bin.

可能与我之前docker-compose通过安装有关apt,但我已删除并清除了此软件包。

har*_*ymc 6

您已经在一处安装了 docker-compose。然后您将其删除并将其安装在另一个位置。

通过这种方式,您遇到了 bash 的优化,因为不必在每次键入命令时都搜索 $PATH,将结果缓存在内存中。路径哈希是一个哈希表,由 bash 维护,其中包含在运行命令时 shell 应在磁盘上查找可执行程序的位置。哈希表在明显使结果无效的事件(例如修改 $PATH)或使用内置hash命令时被清除。

当你再次执行 docker-compose 时,bash 只是试图从它上次找到它的地方获取它,只是它不再存在,所以你得到了那个错误消息。

要使 docker-compose 的哈希无效,请运行以下命令:

 hash docker-compose
Run Code Online (Sandbox Code Playgroud)