Konfigurowanie w celu wykrycia, czy polecenie nie istnieje, sugeruje instalację

22

Czy zshpowłokę można skonfigurować tak, aby pokazywała, co bashpokazuje, gdy polecenie nie istnieje, podobnie jak to:

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

zamiast monitu ZSH:

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

Uwaga: Nie chcę zmieniać samego monitu, ale chcę zmienić wynik z zsh: command not foundna wynik The program 'progname' is currently not installed. You can install it by typing:podobny do bash lub podobny.

Czy to możliwe dzięki ZSH?

Thomas Ward
źródło

Odpowiedzi:

22

Ta funkcja jest dostarczana przez pakiet. Ubuntu instaluje go domyślnie i domyślnie aktywuje w bash, ale nie w zsh. Po prostu dodaj ten wiersz do :command-not-found Zainstaluj polecenie nie znaleziono~/.zshrc

. /etc/zsh_command_not_found
Gilles „SO- przestań być zły”
źródło
To rozwiązanie działało. Czy jest więc sposób na pozbycie się linii na wyjściu? (zwróć uwagę, że został on uwzględniony w danych wyjściowych, podobnie jak jego The program 'progname' is currently not installed. You can install it by typing:część) zsh: command not found: sysv-rc-conf
Thomas Ward
@EvilPhoenix: Gdziekolwiek by to zrobił (z wyjątkiem wewnątrz funkcji lub czegoś oczywiście). Nie wiem o usunięciu zsh: command not foundlinii.
Gilles 'SO - przestań być zły'
Okej, prawdopodobnie mogę zignorować „część polecenia nie znaleziono”. Ponieważ część sugerująca instalację jest fajna, a miło jest się przekonać, że pojawiła się, ponieważ polecenie nie istniało;)
Thomas Ward
aby włączyć command not foundwiadomość, którą możesz dodać exitna końcu funkcji command_not_found_handlerw /etc/zsh_command_not_found.
jens_bo
4

Pamiętaj, że możesz dodać sprawdzenie, czy plik istnieje, jeśli udostępniasz plik .zshrc między dystrybucjami, które nie mają /etc/zsh_command_not_foundpliku:

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

Ponadto, jeśli używasz oh-my-zsh , istnieje już wtyczka, command-not-foundktórą możesz dodać do pluginszmiennej, która robi to samo.

zgerd
źródło
1

Jeśli używasz oh-my-zsh , możesz po prostu szukać „wtyczek” w swoim .zshrc.

Dodaj command-not-foundwtyczkę do listy wtyczek do automatycznego ładowania (ta wtyczka jest już domyślnie zainstalowana).

Lubię to:

# 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
źródło
0

Działa to poprzez funkcję command_not_found_handle () w bash. bash zapewnia hak, który jest w zasadzie funkcją wywoływaną, gdy polecenie nie zostanie znalezione. Implementacja bash Ubuntu przechwytuje go i wyszukuje pakiety, podczas gdy bash Debiana nie (i to samo z zsh). Możesz sprawdzić stronę zsh, aby sprawdzić, czy ma podobną funkcję.

Oto jak możesz zacząć, mając nadzieję, że Zsh jest podobny.

mpandit@mpandit-ubuntu:~$ command_not_found_handle() {echo 'Handler: Command not found!';}
mpandit@mpandit-ubuntu:~$ ddaadada
'Handler: Command not found!
mpandit@mpandit-ubuntu:~$
lobster1234
źródło
To nie jest różnica w bashu Debiana i Ubuntu. Różnica polega na tym, że Ubuntu instaluje command-not-foundsię domyślnie, a Debian nie. Ta funkcja już istnieje dla Zsh, po prostu domyślnie nie jest aktywowana.
Gilles „SO- przestań być zły”
Zakłada się, że polecenie nie znajduje się w systemie. Jednak nie tego szukam. Powiedziawszy to, odpowiedź @Gilles jest bardziej zgodna z tym, czego szukam, po prostu próbuję dowiedzieć się, gdzie dołączyć linię, którą określił.
Thomas Ward
To się nazywa command_not_found_handlerw Zsh. Zobacz zsh.sourceforge.net/Doc/Release/Command-Execution.html .
Mikel,
0

Również jeśli nie chcesz, aby zsh zachowywał się tak przez 100% czasu, możesz po prostu ręcznie zrobić coś takiego:

/usr/lib/command-not-found urxvt

lub dodaj polecenie $ not-found-found do swojej $ PATH

Jason Axelson
źródło
3
kiedy o to pytałem, chciałem, żeby cały czas działał: P
Thomas Ward