Under Construction

Ändern der History Erweiterung vor der Verwendung

In manchen Fällen passt ein Kommando aus der History oder ein Teil eines Kommandos aus der History noch nicht ganz zur gewünschten Aktion. Vielleicht ist eine Pfadkomponente zuviel, eventuell ist der Suffix eines verwendeten Dateinamens zuviel, oder vielleicht müssten nur einige wenige Zeichen ausgetauscht werden, um zum gewünschten Resultat zu kommen. Hier kommt ein weiterer Mechanismus der History Erweiterung (Expansion) ins Spiel. Die über Ereignis Bezeichner und Wort Bezeichner ausgewählten Teile können vor der Verwendung noch modifiziert werden. Hierzu kann den bisherigen Bezeichnern ein weiterer Doppelpunkt „:“ angefügt werden, gefolgt von einem sogenannten Modifizierer. Dieser Modifizierer gibt an, in welcher Form der ausgewählte Teil aus der History geändert werden soll, bevor er dann verwendet wird.

Wir starten mit der folgenden History:

[user01@aixe01 ~]$ history
    1  cksum /opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/8/libstdc++.a
    2  sudo stopsrc -s nimsh
    3  pwd
    4  hostname
    5  history
[user01@aixe01 ~]$

Im Kommando mit der Nummer 1 wurde auf eine Datei über einen relativ langen absoluten Pfad zugegriffen. Nehmen wir an, das einige Kommandos später, die Berechtigungen für das Verzeichnis dieser Datei von Interesse sind. Mit den Bezeichnern „!1:$“ oder „!cks:$“ oder „!?std?:$“ kann schon mal das letzte Argument des Kommandos ausgewählt werden. Wir möchten das Kommando „ls –ld“ auf dem zugehörigen Verzeichnis ausführen. D.h. der Dateiname am Ende des Arguments stört hier und ist zuviel.

Der Dateiname kann durch den Modifizierer „h“ (head) entfernt werden. Dieser entfernt bei Pfaden die letzte Pfad-Komponente:

[user01@aixe01 ~]$ ls -ld !cks:$:h
ls -ld /opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/8
drwxr-xr-x    4 root     system          256 Mar 18 07:46 /opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/8/
[user01@aixe01 ~]$

Wenn wir uns bei einem ls-Kommando bei der Angabe des Ziels vertan haben, dann ist das nicht weiter schlimm. Die Datei(en) oder Verzeichnis(se) werden ja nur angezeigt und nicht geändert oder gar gelöscht. Möchte man, um beim obigen Beispiel zu bleiben, das Verzeichnis sammt Inhalt entfernen „rm –rf“, dann ist es natürlich ungünstig, wenn die History Erweiterung (inklusive Änderung) nicht zum erwarteten Argument führt. Es würde dann das falsche Verzeichnis gelöscht, mit eventuell fatalen Auswirkungen.

Schön wäre also, wenn man sich das Resultat der Ersetzung erst einmal anschauen könnte, ohne das gleich das resultierende Kommando ausgeführt wird. Genau dies erlaubt der Modifizierer „p“ (print, but don’t execute). Dieser kann durch einen weiteren Doppelpunkt „:“ angefügt werden:

[user01@aixe01 ~]$ rm -rf !cks:$:h:p
rm -rf /opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/8
[usr01@aixe01 ~]$

Ist das angezeigte Kommando das gewünschte Kommando, kann es durch Drücken der Cursor-Up Taste ausgewählt werden, oder auch durch Verwenden von „!!“ ausgeführt werden.

Als nächstes Beispiel schauen wir uns das Kommando mit der Nummer 2 an („sudo stopsrc –s nimsh“). Hier wurde ein Dienst (NIM Service Handler) gestoppt. Relativ häufig wird ein Dienst dann kurze Zeit später wieder gestartet. Das zugehörige Kommando wäre dann „sudo startsrc –s nimsh“. Wenn man im Kommando 2 die Zeichenkette „op“ durch „art“ ersetzt, dann erhält man das korrekte Start-Kommando für den Dienst. Für solche Zeichenersetzungen gibt es den Modifizierer „s“ (substitute), dieser wird so verwendet, wie man es vom Kommando sed unter UNIX kennt: „s/old/new/“. Damit lässt sich der Dienst leicht wieder Starten. Mit „!2“ oder „!sudo“ oder „!?stop?“ oder „!?nimsh?“ lässt sich das Kommando zum Stoppen auswählen und dann durch Hinzufügen des Modifizierers „:s/op/art/“ zum Start-Kommando machen:

[user01@aixe01 ~]$ !?nimsh?:s/op/art/
sudo startsrc -s nimsh
0513-059 The nimsh Subsystem has been started. Subsystem PID is 3998112.
[user01@aixe01 ~]$

Nehmen wir an, wir wollen den Dienst sofort wieder Stoppen. Das Start-Kommando war jetzt das letzte Kommando. Wir können uns also mit „!!“ auf das Stop-Kommando beziehen. Ersetzt werden muss dieses Mal „art“ durch „op“. Das wäre dann insgesamt: „!!:s/art/op/“. Da es relativ häufig vorkommt, das das letzte Kommando korrigiert werden soll, gibt es dafür eine eigene Abkürzung. Und zwar „^old^new^“. Das letzte Zeichen („^“) kann weggelassen werden, wenn ein Newline folgt. Damit kann man kürzer „^art^op“ schreiben:

[user01@aixe01 ~]$ ^art^op
sudo stopsrc -s nimsh
0513-044 The nimsh Subsystem was requested to stop.
[user01@aixe01 ~]$

Dies geht deutlich einfacher als mit der Cursor-Up Taste das Kommando zurückholen und dann mit dem Cursor erstmal an die Stelle „art“ gehen und dann die Zeichen manuell austauschen!

Die Ersetzung wird nur einmal vorgenommen! Möchte man alle Vorkommen ersetzen, dann kann dem Modifizierer „s“ der Buchstabe „g“ (global) vorangestellt werden.

Nehmen wir an das Kommando „echo hello hello hello“ wurde kürzlich ausgeführt. Startet man das Kommando erneut, indem man mit „:s“ die Zeichenkette „hello“ durch „hi“ ersetzen lässt, wird nur das erste Vorkommen ersetzt:

[user01@aixe01 ~]$ !echo:s/hello/hi/
echo hi hello hello
hi hello hello
[user01@aixe01 ~]$

Verwendet man hingegen „:gs“ anstelle von „:s“, werden alle drei Vorkommen von „hello“ durch „hi“ ersetzt:

[user01@aixe01 ~]$ !echo:gs/hello/hi/
echo hi hi hi
hi hi hi
[user01@aixe01 ~]$

Nachfolgend eine Übersicht über alle Modifizierer (auch die oben nicht erwähnten):

    • h   Entfernen der letzten Pfad-Komponente (head)
    • t   Entfernen aller Pfad-Komponenten bis auf die letzte (tail)
    • r   Entfernen eines Suffixes der form .xxx
    • e   Entfernen von allem außer dem Suffix.
    • p   Ausgeben des Kommandos, aber nicht ausführen.
    • q   Quoten der ersetzten Worte. Alle ersetzten Worte werden zusammen in ein Paar Apostrophe gesetzt.
    • x   Quoten der ersetzten Worte, Jedes ersetzte Wort wird ein ein eigenes Paar Apostrophe gesetzt.
    • s/old/new   Das erste Vorkommen von „old“ wird durch „new“ ersetzt.
    • &   Die letzte Ersetzung wird wiederholt.
    • g   Die Ersetzung wird global durchgeführt, es wird jedes Vorkommen ersetzt.
    • G   Die Ersetzung wird für jedes Wort nur einmal durchgeführt.