Configurare per rilevare se non esiste un comando, suggerire l'installazione


22

La zshshell può essere configurata per mostrare ciò che bashmostra quando un comando non esiste, in modo simile a questo:

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

piuttosto che il prompt ZSH:

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

Nota Non voglio cambiare il prompt stesso, ma voglio cambiare il risultato da zsh: command not foundun output The program 'progname' is currently not installed. You can install it by typing:simile a bash o simile.

Questo è possibile con ZSH?

Risposte:


22

Questa funzione è fornita dal pacchetto. Ubuntu lo installa di default e lo rende attivo di default in bash ma non in zsh. Aggiungi questa riga al tuo :command-not-found Installa comando non trovato~/.zshrc

. /etc/zsh_command_not_found

Questa soluzione ha funzionato. C'è un modo per sbarazzarsi di una linea nell'output, quindi? (nota che è stato incluso nell'output, così come la The program 'progname' is currently not installed. You can install it by typing:parte) zsh: command not found: sysv-rc-conf
Thomas Ward

@EvilPhoenix: Ovunque farebbe (tranne all'interno di una funzione o qualcosa ovviamente). Non so come rimuovere la zsh: command not foundlinea.
Gilles 'SO- smetti di essere malvagio' il

Ok, probabilmente posso ignorare il "comando non trovato parte". Perché la parte dell'installazione suggerita è buona, ed è bello sapere che è venuto fuori perché non esisteva un comando;)
Thomas Ward

per disattivare il command not foundmessaggio è possibile aggiungere exitalla fine della funzione command_not_found_handlerin /etc/zsh_command_not_found.
jens_bo,

4

Nota che potresti voler aggiungere un segno di spunta se il file esiste se stai condividendo il tuo .zshrc tra distribuzioni che non hanno un /etc/zsh_command_not_foundfile:

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

Inoltre, nel caso in cui stai usando oh-my-zsh , esiste già un plug-in command-not-found, che puoi aggiungere alla tua pluginsvariabile che fa la stessa cosa.


1

Se stai usando oh-my-zsh , puoi semplicemente cercare "plugin" all'interno del tuo .zshrc.

Aggiungi il command-not-foundplug- in all'elenco dei plug-in per il caricamento automatico (questo plug-in è già installato per impostazione predefinita).

Come questo:

# 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

Il modo in cui funziona è tramite la funzione command_not_found_handle () in bash. bash fornisce un hook che è fondamentalmente una funzione che viene invocata quando non viene trovato un comando. L'implementazione bash di Ubuntu lo intrappola e fa una ricerca di pacchetti, mentre la bash di Debian no (e lo stesso con zsh). Potresti voler controllare la manpage di zsh per vedere se ha una funzione simile.

Ecco come iniziare, sperando che zsh sia simile.

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

Questa non è una differenza nella bash di Debian e Ubuntu. La differenza è che Ubuntu si installa command-not-founddi default e Debian no. La funzione esiste già anche per zsh, non è attivata per impostazione predefinita.
Gilles 'SO- smetti di essere cattivo'

Ciò presuppone che command_not_found non sia incluso nel sistema. Tuttavia non è quello che sto cercando. Detto questo, la risposta di @Gilles è più in linea con ciò che sto cercando, sto solo cercando di capire dove includere la linea che ha specificato.
Thomas Ward

Si chiama command_not_found_handlerin zsh. Vedi zsh.sourceforge.net/Doc/Release/Command-Execution.html .
Mikel,

0

Inoltre, se non vuoi che zsh abbia questo comportamento al 100% delle volte, puoi semplicemente fare qualcosa come:

/usr/lib/command-not-found urxvt

oppure aggiungi il comando non trovato nel tuo $ PATH


3
quando ho chiesto questo, volevo che funzionasse sempre: P
Thomas Ward
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.