コマンドが存在しないかどうかを検出するための構成、インストールを提案


22

次のように、コマンドが存在しない場合zshに表示される内容を表示するようにシェルを構成できますか?bash

kahless:~$ sysv-rc-conf  
The program 'sysv-rc-conf' is currently not installed.  You can install it by typing:  
sudo apt-get install sysv-rc-conf

ZSHプロンプトではなく:

[kahless /home/teward]% sysv-rc-conf  
zsh: command not found: sysv-rc-conf

注プロンプト自体を変更したくないのですが、結果をzsh: command not foundbashのような出力The program 'progname' is currently not installed. You can install it by typing:または同様のものに変更したいのです。

これはZSHで可能ですか?

回答:


22

この機能はパッケージによって提供されます。Ubuntuはデフォルトでインストールし、bashではデフォルトでアクティブにしますが、zshではアクティブにしません。この行をに追加するだけです:command-not-found command-not-foundをインストールします~/.zshrc

. /etc/zsh_command_not_found

このソリューションは機能しました。出力の行を取り除く方法はありますか?(そのThe program 'progname' is currently not installed. You can install it by typing:部分と同様に、出力に含まれていたことに注意してください) zsh: command not found: sysv-rc-conf
トーマスウォード

@EvilPhoenix:どこでもできます(関数内または明らかに何かを除く)。zsh: command not found行の削除については知りません。
ジル 'SO-悪であるのをやめる'

さて、「コマンドが見つからない部分」はおそらく無視できます。提案インストール部分が素晴らしく、コマンドが存在しなかったためにそれが出てきたのは良いことだからです;)
トーマス・ウォード

ターンにcommand not foundメッセージを追加することができexit、関数の最後でcommand_not_found_handlerの中で/etc/zsh_command_not_found
jens_bo

4

ファイルを持たないディストリビューション間で.zshrcを共有している場合は、ファイルが存在するかどうかのチェックを追加する必要があることに注意してください/etc/zsh_command_not_found

[[ -a "/etc/zsh_command_not_found" ]] && . /etc/zsh_command_not_found

また、oh-my-zshを使用している場合、同じことを行う変数にcommand-not-found追加できるプラグインが既にありますplugins


1

oh-my-zshを使用している場合、代わりにの中で「プラグイン」を探すことができます.zshrc

自動ロードするプラグインのリストにプラグcommand-not-foundインを追加します(このプラグインはデフォルトですでにインストールされています)。

このような:

# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(git command-not-found)

0

動作方法は、bashのcommand_not_found_handle()関数を使用することです。bashは、基本的にコマンドが見つからないときに呼び出される関数であるフックを提供します。Ubuntuのbash実装はそれをトラップしてパッケージ検索を実行しますが、Debianのbashは実行しません(zshでも同じです)。zshのマンページを調べて、同様の機能があるかどうかを確認してください。

zshが似ていることを望んで、ここから始めることができます。

mpandit@mpandit-ubuntu:~$ command_not_found_handle() {echo 'Handler: Command not found!';}
mpandit@mpandit-ubuntu:~$ ddaadada
'Handler: Command not found!
mpandit@mpandit-ubuntu:~$

これはDebianとUbuntuのbashの違いではありません。違いは、Ubuntuはcommand-not-foundデフォルトでインストールされ、Debianはインストールされないことです。この機能はzshにも既に存在し、デフォルトでは有効化されていません。
ジル 'SO-悪である停止

これは、command_not_foundがシステムに含まれていないことを前提としています。しかし、それは私が探しているものではありません。そうは言っても、@ Gillesからの答えは、私が探しているものに沿ったものであり、彼が指定した行をどこに含めるかを考えています。
トーマス・ウォード

command_not_found_handlerzshで呼び出されます。zsh.sourceforge.net/Doc/Release/Command-Execution.htmlを参照してください。
ミケル14

0

また、zshに100%の時間この動作をさせたくない場合は、次のように手動で行うことができます。

/usr/lib/command-not-found urxvt

または、command-not-foundを$ PATHに追加します


3
私がこれを尋ねたとき、私はそれが常に動作することを望みました:P
トーマスウォード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.