为什么 Bash 会对位于我的 PATH 中的程序给出“没有此文件或目录”的提示?

为什么 Bash 会对位于我的 PATH 中的程序给出“没有此文件或目录”的提示?

docker-compose按照以下说明在我的 Ubuntu 16.04 机器上进行了安装https://docs.docker.com/compose/install/使用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

/usr/local/bin/在我的 PATH 中:

$ 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

/usr/bin请注意,实际上它位于 之前。

当我尝试检查其版本时,我收到了似乎与 PATH 相关的错误:

$ docker-compose --version
bash: /usr/bin/docker-compose: No such file or directory

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

$ /usr/local/bin/docker-compose --version
docker-compose version 1.24.0, build 0aa59064

sudo或者使用

$ sudo docker-compose --version
docker-compose version 1.24.0, build 0aa59064

为什么我不能运行$ docker-compose --version?为什么 Bash 特别抱怨/usr/bin,而它应该在 中找到可执行文件/usr/local/bin

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

答案1

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

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

当您再次执行 docker-compose 时,bash 只是尝试从上次找到它的地方获取它,但它已经不再存在,因此您收到该错误消息。

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

 hash docker-compose

答案2

问题似乎是以前安装中存在的定位条目,apt-get remove并且apt-get purge没有被删除或清除。

hash docker-compose删除该条目。更多信息可以在这里找到:

https://github.com/docker/compose/issues/3371#issuecomment-381162525 https://unix.stackexchange.com/questions/82991/bash-is-not-finding-a-program-even-though-its-on-my-path

答案3

使用 Snap 安装 Docker 后,您从 snap 中删除了 docker 并在没有 snap 的情况下进行了安装,但路径仍然指向位置 /snap/bin/docker,因此如果出现此错误,请更新 PATH 的值以获取预期输出。

答案4

我使用 snap 删除了现有的 docker,并安装了最新的 docker。我看到了同样的问题。我尝试运行“hash docker-compose”,但我的系统找不到“hash”命令。我关闭终端并重新打开另一个终端,问题就消失了。

相关内容