Alias ​​für einen Befehl, der !! verwendet, um den letzten Befehl abzurufen

Alias ​​für einen Befehl, der !! verwendet, um den letzten Befehl abzurufen

Dies ist eine Folgefrage zu

Führen Sie eine Befehlszeile mit einem sudo aus

Wenn Sie den gleichen Befehl wiederholen möchten mitsudo !!nachdem Sie einen Befehl wie diesen ausgeführt haben:

echo "something">/path/file

Sie können die globale Ersetzungssyntax verwenden, um den Befehl erneut aufzurufen:

!!:gs/>/|sudo tee -a /

Verwenden Sie ein Leerzeichen nach dem-AParameter.

Dies ist das Äquivalent zusudo!!hilft Ihnen aber, die Sudo-Einschränkungen für < und > zu umgehen. Denn Sudo erlaubt die Verwendung von [<, >] nicht.

Wie kann ich dies in einen Alias ​​auf meinem Computer einfügen, .bashrcdamit ich es einfach verwenden kann?

Ich habe es versucht

alias redo='!!:gs/>/|sudo tee -a /'

Aber das funktioniert nicht, ich erhalte die Fehlermeldung:

$ echo "sdfdsf">/path/file
bash: /path/file: no permissions

$ redo
bash: /: Is a directory
tee: /: Is a directory

Antwort1

Ich glaube, Sie suchen Folgendes:

sudo sh -c "!!"

Dies wird !!in Ihren letzten Befehl übersetzt und hält die Shell-Umleitungen/Pipes/Variablen funktionsfähig:

➜  ~  ping 10.0.0.1
--- 10.0.0.1 ping statistics ---
6 packets transmitted, 3 received, 50% packet loss, time 5001ms
rtt min/avg/max/mdev = 1.736/1.951/2.182/0.185 ms
➜  ~  sudo sh -c "!!" ## And becomes like this:
➜  ~  sudo sh -c "ping 10.0.0.1"

Antwort2

Das ist zwar keine direkte Antwort auf Ihre Frage, aber: Tun Sie das nicht.

Die Idee hinter diesem Alias ​​(vorausgesetzt, es hat funktioniert) ist, dass die Umwandlung >in |tee -a fooeine gute Idee ist. Zunächst einmal sind sie selbst im besten Fall nicht gleichwertig. >überschreibt eine Datei, tee -ahängt an.

Zweitens werden hierdurch keine allgemeinen Konstrukte wie echo >>foo(das umgewandelt würde in echo |sudo tee -a |sudo tee -a foound fehlschlagen würde) oder echo 2>&1(das umgewandelt würde in echo 2|sudo tee -a &1und fehlschlagen würde) verarbeitet.

Nun können Sie möglicherweise eine viel kompliziertere Ersetzung schreiben, die alle diese Fälle angemessen behandeln könnte, aber das bringt mich zu meinem dritten Punkt:

Dadurch wird ein Befehl als Root ausgeführt, ohne dass Sie die Möglichkeit haben, den auszuführenden Befehl zu überprüfen. Das halte ich für eine äußerst schlechte Idee, insbesondere angesichts der Tatsache, dass es wahrscheinlich ziemlich komplex sein wird, bis Sie etwas haben, das auch nur für die gängigsten Fälle funktioniert.

Insgesamt würde ich Ihnen also empfehlen, nichts dieser Art zu versuchen.

verwandte Informationen