Kiedy wpiszesz polecenie, które nie istnieje w twoim systemie, bash uruchamia funkcję command_not_found_handle()
. W tej funkcji jest wywołanie /usr/lib/command-not-found
skryptu, które drukuje wiadomości.
Ubuntu 12.04
Moja pierwsza próba zmiany źródła tego skryptu, aby stdout
zamiast tego wyświetlać komunikaty stderr
, ale kiedy czytałem źródło skryptu, stwierdziłem, że możesz go skonfigurować tak, aby pytał, czy chcesz zainstalować brakujący pakiet.
Jeśli eksportujesz zmienną COMMAND_NOT_FOUND_INSTALL_PROMPT
, zostaniesz poproszony o zainstalowanie brakującego pakietu:
pbm@ubuntu:~$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ export COMMAND_NOT_FOUND_INSTALL_PROMPT=""
pbm@ubuntu:~$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
Do you want to install it? (N/y)y
sudo apt-get install git
[sudo] password for pbm:
Starsze wersje Ubuntu
Niestety nie ma, COMMAND_NOT_FOUND_INSTALL_PROMPT
więc mogę znaleźć kilka innych opcji:
1) Zainstaluj pakiet od 12.04 - to nie powinien być problem - w Pythonie jest tylko kilka skryptów, więc powinno działać (niesprawdzone!).
2) Zmień stderr
na stdout
. W tym celu edytuj plik /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py
i przejdź stderr
do stdout
linii 237 i 240.
Następnie możesz go używać w następujący sposób:
pbm@ubuntu:~$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
pbm@ubuntu:~$ `git`
//Installation begins
Jeśli dodasz -y
opcję do apt-get
polecenia w wierszach 237 i 240, możesz również użyć składni !! | sh
.
3) Możesz również zmodyfikować ten skrypt z linii 242 w następujący sposób:
print >> sys.stderr, _("You can install it by typing:")
f = open("%s/.install-missing" % os.path.expanduser('~'),'w')
print >> sys.stderr, "sudo apt-get install %s" % packages[0][0]
print >> f, "sudo apt-get install %s" % packages[0][0]
f.close()
W ten sposób otrzymasz polecenie w pliku ~/.install-missing
, dzięki czemu możesz utworzyć alias:
alias im="chmod +x ~/.install-missing; ~/.install-missing"
Jeśli zadzwonisz im
pakiet zostanie zainstalowany.
/usr/lib/command-not-found
ale nie ma odniesienia doCOMMAND_NOT_FOUND_INSTALL_PROMPT
- myśli?