Ubuntuには
command-not-foundの仕組み
UbuntuでCLIで操作している時,
プログラム 'sl' はまだインストールされていません。 次のように入力することでインストールできます: sudo apt install sl
これは
command-not-foundはUbuntu 6.
- ※1
- 過去には
「notepad」 と入力したら 「Ubuntuには似たようなプログラムとしてgeditやkwriteがあります」 とか, 「excel」 と入力したら 「Ubuntuには (中略) gnumericがあります」 と表示する機能もありました。 - ※2
- ちなみにDebianにも同名のパッケージはありますが,
基本的な考え方は同じもののいくつかの事情によりその仕組みは異なっています。具体的にはDebian版の場合, パッケージ名とコマンド名の対応表を apt-fileコマンドで生成します。また現時点ではPython3にも未対応のようです。
仕組みはすごく単純です。Bashには検索パスにコマンドが見つからない場合,command_関数を呼び出すという仕組みが存在します。Ubuntuのbashパッケージが提供する/etc/には最初から,command-not-foundがインストール済みならcommand_を定義するスクリプトが組み込まれていますので,
- ※3
- zshにも同等の
command_関数が存在します。command-not-foundパッケージによってnot_ found_ handler /etc/がインストールされますので,zsh_ command_ not_ found zsh環境でも同じ機能が使えます。
# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
function command_not_found_handle {
# check because c-n-f could've been removed in the meantime
if [ -x /usr/lib/command-not-found ]; then
/usr/lib/command-not-found -- "$1"
return $?
elif [ -x /usr/share/command-not-found/command-not-found ]; then
/usr/share/command-not-found/command-not-found -- "$1"
return $?
else
printf "%s: command not found\n" "$1" >&2
return 127
fi
}
fi
command-not-foundの実体は/usr/です。ここにコマンド引数の最初の文字列
PATHにはないもののインストール済みかをチェックする- apt/
aptitudeがインストールされていない場合は, ただ 「見つかりません」 のエラーのみを表示する - ブラックリスト
(後述) に見つかったら, ただ 「見つかりません」 のエラーのみを表示する - パス名から該当するパッケージを検索する
- パッケージが複数見つかったらパッケージリストとインストール方法を表示する
- 該当するパッケージが1つのときはインストール方法
( sudo apt PACKAGE)を提示する - 該当パッケージのコンポーネント
(mainやuniverse) が無効化されていたら有効化するように伝える - パッケージが見つからずなおかつコマンドが3文字以上なら単なるスペルミスの可能性を考慮して
「もしかして」 を表示する
つまり
プログラム 'sl' はまだインストールされていません。 'sl' を利用するために,コンピュータの管理者に 'sl' をインストールすることを相談してください
動作をカスタマイズする
command-not-foundは初心者にとって便利な機能ですが,
command-not-foundを無効化する
無効化する一番手っ取り早い方法は,~/.bashrc」
# disable command-not-found
function command_not_found_handle {
printf "%s: command not found\n" "$1" >&2
return 127
}
要するに関数の定義を上書きしているだけですね。