Collegati al gestore "comando non trovato" in Ubuntu


9

Voglio agganciare il gestore per il comando non trovato

wim@SDFA100461C:~$ thing
No command 'thing' found, did you mean:
 Command 'tping' from package 'lam-runtime' (universe)
 Command 'thin' from package 'thin' (universe)
thing: command not found

Voglio ignorare questo comportamento con il mio script.

In particolare, voglio verificare se il comando esiste nell'output di lsvirtualenv -be, in tal caso, voglio attivare quel virtualenv.

Dove dovrei iniziare l'hacking?


1
Questo potrebbe aiutare: askubuntu.com/a/73282/10127
glenn jackman,

Risposte:


8

In generale

Il Linux Journal ha un articolo abbastanza buono:

Dalla pagina man di bash:

... Una ricerca completa delle directory in PATH viene eseguita solo se il comando non viene trovato nella tabella hash. Se la ricerca non ha esito positivo, la shell cerca una funzione di shell definita denominata command_not_found_handle. Se tale funzione esiste, viene invocata con il comando originale e gli argomenti del comando originale come argomenti, e lo stato di uscita della funzione diventa lo stato di uscita della shell. Se tale funzione non è definita, la shell stampa un messaggio di errore e restituisce uno stato di uscita di 127.

e

Un rapido grep in / etc ha scoperto dove stava accadendo. La funzione stessa è in / etc / bash_command_not_found e quella funzione viene inclusa (se esiste) nella sessione bash tramite /etc/bash.bashrc.

Ubuntu 14.04

L'evidenza empirica suggerisce che su un'installazione Ubuntu 14.04, il file / etc / bash_command_not_found non esiste, tuttavia, il file corretto è uno script Python, che si trova in / usr / lib / command-not-found


1
Questo mi ha messo sulla strada giusta, ma il programma reale era uno script Python situato in /usr/lib/command-not-found. Nella mia installazione di Ubuntu 14.04, il file /etc/bash_command_not_foundnon esiste.
mercoledì

Grazie, l'ho aggiunto alla mia risposta per i futuri spettatori
Andrew Stubbs,

1

Per bash, il suo comportamento è governato dalla funzione shell command_not_found_handle(Vedi man bash, in ESECUZIONE COMANDO).

Per vedere quale comportamento è definito da quella funzione, puoi emettere:

declare -p -f command_not_found_handle

È possibile modificare il programma utilizzato ridefinendo la command_not_found_handlefunzione.

In Ubuntu 14.04 LTS, sembra che il comportamento predefinito sia definito direttamente in /etc/bash.bashrc:

# 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
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.