存在するコマンドに対して、コマンドが見つからないハンドラーがトリガーされるのはなぜですか?

存在するコマンドに対して、コマンドが見つからないハンドラーがトリガーされるのはなぜですか?

Ubuntu リポジトリで利用できるバージョンが古すぎるパッケージ (この場合は Docker) があったので、Docker リポジトリを apt ソースに追加し、そこからパッケージをインストールしました。

さて、通常のユーザーで実行しようとすると、コマンドが見つからないハンドラーが起動します。

user@host:~$ docker
The program 'docker.io' is currently not installed. You can install it by typing:
sudo apt-get install docker.io

バイナリは確かに私のパスにありますが:

user@host:~$ which docker
/usr/bin/docker

そして、私はそれに対する実行権限を持っています:

user@host:~$ /usr/bin/docker
Usage: docker [OPTIONS] COMMAND [arg...]

A self-sufficient runtime for linux containers.
....

試してみましたがhash -r、新しいログイン シェルを実行しようとしましたが、うまくいきませんでした。コマンドが見つからないハンドラーが引き続き起動します。

なぜそのように動作するのでしょうか? Ubuntu リポジトリのパッケージは と呼ばれていますdocker.ioが、Docker リポジトリのパッケージは と呼ばれているだけなのでしょうかdocker?

完全に削除せずにこの問題を修正できますかcommand-not-found?

編集: Docker リポジトリから最新バージョンをインストールする方法:

sudo -i
apt-get purge docker.io
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
echo "deb https://get.docker.com/ubuntu docker main" >/etc/apt/sources.list.d/docker.list
apt-get update
apt-get install docker

編集2: 言及するのを忘れていましたが、/usr/bin/docker がラッパー スクリプトではないことを確認しました。

user@host:~$ file /usr/bin/docker
/usr/bin/docker:  ELF 64-bit LSB  executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=a5773ec80f810b977dc93bb10b4c6c6b8c2b1abd, not stripped

答え1

多くの場合、これはエイリアスの問題です。たとえば、bashrc/zshrc の alias docker=docker.io などです。また、バージョン A とバージョン B が一緒にインストールされていないことも確認する価値があります。これにより、パッケージと名前の競合が発生することがよくあります。

関連情報