Wenn Sie konfigurieren, um festzustellen, ob ein Befehl nicht vorhanden ist, schlagen Sie die Installation vor

22

Kann die zshShell so konfiguriert werden, dass angezeigt wird, was bashangezeigt wird, wenn ein Befehl nicht vorhanden ist?

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

anstatt der ZSH-Eingabeaufforderung:

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

Hinweis Ich möchte die Eingabeaufforderung selbst nicht ändern, aber ich möchte das Ergebnis von zsh: command not foundin eine bash-ähnliche Ausgabe von The program 'progname' is currently not installed. You can install it by typing:oder ähnlichem ändern .

Ist das mit ZSH möglich?

Thomas Ward
quelle

Antworten:

22

Diese Funktion wird vom Paket bereitgestellt. Ubuntu installiert es standardmäßig und aktiviert es standardmäßig in bash, aber nicht in zsh. Fügen Sie einfach diese Zeile zu Ihrem hinzu :command-not-found Installieren Sie command-not-found~/.zshrc

. /etc/zsh_command_not_found
Gilles 'SO - hör auf böse zu sein'
quelle
Diese Lösung hat funktioniert. Gibt es eine Möglichkeit, eine Zeile in der Ausgabe zu entfernen? (Beachten Sie, dass es in der Ausgabe enthalten war, ebenso wie der The program 'progname' is currently not installed. You can install it by typing:Teil) zsh: command not found: sysv-rc-conf
Thomas Ward
@ EvilPhoenix: würde überall tun (außer in einer Funktion oder etwas offensichtlich). Ich weiß nicht, wie ich die zsh: command not foundLeitung entfernen soll .
Gilles 'SO- hör auf böse zu sein'
Okay, ich kann wahrscheinlich den "Befehl nicht gefunden Teil" ignorieren. Weil der Suggest-Installationsteil nett ist und es nett zu wissen ist, dass er aufgetaucht ist, weil ein Befehl nicht existiert hat;)
Thomas Ward
Zum Ausschalten der command not foundNachricht können Sie exitam Ende der Funktion command_not_found_handlerin hinzufügen /etc/zsh_command_not_found.
jens_bo
4

Beachten Sie, dass Sie möglicherweise eine Prüfung hinzufügen möchten, ob die Datei vorhanden ist, wenn Sie Ihre .zshrc- /etc/zsh_command_not_foundDatei für Distributionen freigeben, für die keine Datei vorhanden ist:

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

Für den Fall, dass Sie oh-my-zsh verwenden , gibt es bereits ein Plugin command-not-found, das Sie zu Ihrer pluginsVariablen hinzufügen können , die dasselbe tut.

zgerd
quelle
1

Wenn Sie oh-my-zsh verwenden , können Sie stattdessen nach "Plugins" in Ihrem Browser suchen .zshrc.

Fügen Sie das command-not-foundPlugin zur Liste der Plugins hinzu, die automatisch geladen werden sollen (dieses Plugin ist standardmäßig bereits installiert).

So was:

# 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)
qaisjp
quelle
0

Die Funktionsweise erfolgt über die Funktion command_not_found_handle () in bash. bash stellt einen Hook bereit, der im Grunde genommen eine Funktion ist, die aufgerufen wird, wenn ein Befehl nicht gefunden wird. Ubuntus Bash-Implementierung fängt es ab und führt eine Paketsuche durch, während Debians Bash dies nicht tut (und dasselbe gilt für zsh). Vielleicht möchten Sie die Manpage von zsh lesen, um zu sehen, ob diese eine ähnliche Funktion hat.

Hier ist, wie Sie anfangen können, in der Hoffnung, dass zsh ähnlich ist.

mpandit@mpandit-ubuntu:~$ command_not_found_handle() {echo 'Handler: Command not found!';}
mpandit@mpandit-ubuntu:~$ ddaadada
'Handler: Command not found!
mpandit@mpandit-ubuntu:~$
lobster1234
quelle
Dies ist kein Unterschied in Debian und Ubuntus Bash. Der Unterschied ist, dass Ubuntu command-not-foundstandardmäßig installiert wird und Debian nicht. Die Funktion ist auch für zsh bereits vorhanden, sie ist jedoch standardmäßig nicht aktiviert.
Gilles 'SO- hör auf böse zu sein'
Dies setzt voraus, dass command_not_found nicht im System enthalten ist. Es ist jedoch nicht das, wonach ich suche. Allerdings entspricht die Antwort von @Gilles eher dem, wonach ich suche. Ich versuche nur herauszufinden, wo die von ihm angegebene Zeile eingefügt werden soll.
Thomas Ward
Es heißt command_not_found_handlerin zsh. Siehe zsh.sourceforge.net/Doc/Release/Command-Execution.html .
Mikel
0

Auch wenn Sie nicht möchten, dass zsh dieses Verhalten 100% der Zeit hat, können Sie einfach etwas manuell tun:

/usr/lib/command-not-found urxvt

Oder fügen Sie Ihrem $ PATH einen Befehl hinzu, der nicht gefunden wurde

Jason Axelson
quelle
3
als ich das gefragt habe, wollte ich, dass es die ganze zeit funktioniert: P
Thomas Ward