ubuntuのbashで存在しないコマンドを実行した場合、
$ ruby
コマンド 'ruby' が見つかりません。次の方法でインストールできます:
sudo snap install ruby  # version 3.0.0, or
sudo apt  install ruby  # version 1:2.7+1
他のバージョンについては 'snap info ruby' を確認してください。
のようになる。だがzshでは
$ ruby
zsh: command not found: ruby
だけしかメッセージが表示されないため、いつもubuntu {パッケージ名} インストールでggっている。
コマンドが見つからないときの挙動
調べてみるとコマンドが見つからないときには関数command_not_found_handleが実行されるようだ。関数の定義はdeclareで調べられるらしい。実行してみると
$ declare -f command_not_found_handle
command_not_found_handle ()
{ 
    if [ -x /usr/lib/command-not-found ]; then
        /usr/lib/command-not-found -- "$1";
        return $?;
    else
        if [ -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" 1>&2;
            return 127;
        fi;
    fi
}
となる。つまり、/usr/lib/command-not-foundがあればそれを、/usr/share/command-not-found/command-not-foundがあればそれを、両者ともなければ単純なメッセージを表示するという内容である。つまり、これを~/.zshrcにコピペすれば、
$ ruby
コマンド 'ruby' が見つかりません。次の方法でインストールできます:
sudo snap install ruby  # version 3.0.0, or
sudo apt  install ruby  # version 1:2.7+1
他のバージョンについては 'snap info ruby' を確認してください。
成功!!
/usr/lib/command-not-found
筆者の環境では、/usr/lib/command-not-foundが実行されるようである。これのhelpを表示してみると、
Usage: command-not-found [オプション] <コマンド名>
Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -d DATA_DIR, --data-dir=DATA_DIR
                        データフィールドの検索に次のパスを使う
  --ignore-installed, --ignore-installed
                        ローカルのバイナリーを無視して、利用可能なパッケージを表示する
  --no-failure-msg      '<コマンド名>: コマンドが見つかりません' を出力しない
と、表示される。また、ggってみると、環境変数COMMAND_NOT_FOUND_INSTALL_PROMPTをyに設定すると、インストールできる項目が一つしかない場合に、インストールするか聞いてくれます。

参考