Wenn Sie einen Befehl eingeben, der in Ihrem System nicht vorhanden ist, führt bash die Funktion aus command_not_found_handle()
. In dieser Funktion wird ein /usr/lib/command-not-found
Skript aufgerufen, das Nachrichten druckt.
Ubuntu 12.04
Meine erste Vermutung, die Quelle dieses Skripts zu ändern, um stdout
stattdessen Nachrichten zu drucken stderr
, aber als ich die Quelle des Skripts las, stellte ich fest, dass Sie es so konfigurieren können, dass Sie nur gefragt werden, ob Sie das fehlende Paket installieren möchten.
Wenn Sie eine Variable exportieren, werden COMMAND_NOT_FOUND_INSTALL_PROMPT
Sie aufgefordert, das fehlende Paket zu installieren:
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:
Ältere Versionen von Ubuntu
Leider gibt es keine, COMMAND_NOT_FOUND_INSTALL_PROMPT
so dass ich einige andere Optionen finden kann:
1) Installieren Sie das Paket ab 12.04 - es sollte nicht das Problem sein - es sind nur wenige Skripte in Python, also sollte es funktionieren (ungetestet!).
2) Wechseln Sie stderr
zu stdout
. Um es zu tun bearbeitet Datei /usr/lib/python2.7/dist-packages/CommandNotFound/CommandNotFound.py
und ändern stderr
zu stdout
in den Zeilen 237 und 240.
Danach können Sie es folgendermaßen verwenden:
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
Wenn Sie -y
dem apt-get
Befehl in den Zeilen 237 und 240 eine Option hinzufügen , können Sie auch die Syntax verwenden !! | sh
.
3) Sie können dieses Skript auch in Zeile 242 folgendermaßen ändern:
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()
Auf diese Weise erhalten Sie Ihren Befehl in einer Datei ~/.install-missing
, sodass Sie einen Alias erstellen können:
alias im="chmod +x ~/.install-missing; ~/.install-missing"
Wenn Sie im
Paket anrufen , wird installiert.
/usr/lib/command-not-found
aber keinen Bezug zuCOMMAND_NOT_FOUND_INSTALL_PROMPT
- Gedanken?Sie waren auf dem richtigen Weg mit:
... aber dir fehlt eine Option zu sh . Erwägen:
Und da Sie wahrscheinlich Root-Zugriff benötigen, um apt-get auszuführen, sollten Sie Folgendes berücksichtigen:
quelle
Sie können so etwas tun:
!! 2>&1 | tail -n 1 > /tmp/cmd; bash /tmp/cmd; rm /tmp/cmd
Interaktive Programme scheinen mit Piping nicht gut zu funktionieren, da sie eine Eingabe erwarten, in diesem Fall 'Y', aber der Stdin-Dateideskriptor wird geschlossen, sobald der erste Befehl beendet ist.
quelle
eval
Ich glaube, Sie können eine Variable und eine Befehlssubstitution verwenden (obwohl ich nicht sicher bin, wie sicher dies alles sein würde):Ich bin bereit, mich mit dem oben Gesagten als falsch zu erweisen. Ich teste dies auf einem Red Hat-Computer mit einem
echo
Befehl und nicht mit dem automatisch vorgeschlagenen Bash-Abschluss, aber das Prinzip sollte dasselbe sein.Am Ende des Tages wäre es schneller, einfach aptitude install git einzugeben ...
quelle