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-foundskryptu, które drukuje wiadomości.
Ubuntu 12.04
Moja pierwsza próba zmiany źródła tego skryptu, aby stdoutzamiast 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_PROMPTwię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ń stderrna stdout. W tym celu edytuj plik /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.pyi przejdź stderrdo stdoutlinii 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 -yopcję do apt-getpolecenia 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 impakiet zostanie zainstalowany.
/usr/lib/command-not-foundale nie ma odniesienia doCOMMAND_NOT_FOUND_INSTALL_PROMPT- myśli?