Kann ich benutzen '!!' in Aliasnamen oder Skripten?

10

Im Terminal kann ich verwenden, !!was auf meinen vorherigen Befehl verweist.
Ist es möglich, dies in einem Alias ​​zu verwenden? Ich habe es versucht, aber was passiert ist, dass die doppelten Ausrufezeichen wörtlich interpretiert werden.

Was ich möglich haben möchte ist:

  1. Ich gebe einen Befehl ein
  2. Ich gebe einen Alias ​​ein, der enthält, was in Schritt 1 eingegeben wurde

Wenn es eine Lösung mit Skripten gibt, ist dies ebenfalls akzeptabel.

Ludwig Magnusson
quelle
Was ist dein Hauptziel? Weitere Optionen zum letzten Befehl hinzufügen?
Sergiy Kolodyazhnyy
Nein, mein Ziel ist es, schnell einen langen Befehl einzugeben, den ich oft benutze. In der Mitte ist eine lange Saite, die oft das vorherige Kommando ist
Ludwig Magnusson
Anscheinend möchten Sie nur einen fcBefehl, damit ein Texteditor geöffnet wird, da dies der einfachste Weg ist, lange Befehle zu bearbeiten. Lassen Sie es mich meinem Beitrag hinzufügen. Vielleicht könnten Sie auch ein Beispiel für einen Befehl geben?
Sergiy Kolodyazhnyy
Eine
Änderung

Antworten:

11

Der Befehl, der den zuletzt ausgeführten Befehl auflistet, lautet fc -nl -1. Mithilfe der Ausgabesubstitution können wir demselben Inhalt weitere Parameter hinzufügen

$> ls /etc/passwd
/etc/passwd
$> $(fc -nl -1)  /etc/group                                                     
/etc/group  /etc/passwd
$> 

Das Zitieren kann jedoch ein Problem bei diesem Ansatz sein

Eine sehr schöne Funktion von fcist, dass, wenn Sie den fcBefehl einfach selbst ausführen , der in der FCEDITVariablen angegebene Texteditor geöffnet wird (in dem Sie wahrscheinlich speichern möchten ~/.bashrc) und der Inhalt der Zeile Ihr letzter Befehl ist. Ich schlage vor, Sie verwenden es nanoals Texteditor, aber wenn Sie es wissen vim - noch besser.

Was ist zum Beispiel, wenn ich eine qdbus org.ayatana.bamf /org/ayatana/bamf/matcher org.ayatana.bamf.matcher.ActiveWindowgroße Zeile bearbeiten muss? Aber mit fckann ich öffnen vimund bearbeiten /org/ayatana/bamf/matcher, speichern, beenden und es wird ausgeführt.

Sergiy Kolodyazhnyy
quelle
9

Sie können nicht verwenden, !!aber ...

Aus dem Handbuch :

Ein nützlicher Alias ​​für den Befehl fc ist r='fc -s', dass durch Eingabe von 'r cc' der letzte Befehl ausgeführt wird, der mit cc beginnt, und durch Eingabe von 'r' der letzte Befehl erneut ausgeführt wird.

Rinzwind
quelle
Auf diese Weise kann ich am Anfang meines letzten Befehls etwas hinzufügen. Was ist mittendrin?
Ludwig Magnusson
8

Wenn Sie darauf bestehen, die !!Verlaufserweiterungssyntax anstelle von fc(bereits erwähnt) zu verwenden, gibt es einen Weg.

Standardmäßig ist die historyErweiterung für nicht interaktive Shell-Sitzungen deaktiviert, z. B. in Skripten.

Um die Verlaufserweiterung in Skripten zu aktivieren, aktivieren Sie zuerst die entsprechenden Shell-Optionen:

set -o history 
set -o histexpand

set -o histexpandkann auch so geschrieben set -Hwerden.

Jetzt würden die Verlaufserweiterungsoperationen zB !!im Skript funktionieren.

heemayl
quelle