Under Construction

Auswählen eines Eintrags aus der History mit „!“

Hier noch einmal kurz die aktuelle History von der wir ausgehen:

[user01@aixe01 ~]$ history
    1  ls -l /usr
    2  vi sample.txt
    3  ls -l sample.txt
    4  cat sample.txt
    5  cp sample.txt sample.txt.bak
    6  history
[user01@aixe01 ~]$

Zunächst einmal muss ein Kommando aus der History ausgewählt werden. Dazu gibt es mehrere Möglichkeiten. Die einfachste Möglichkeit besteht darin einfach die Nummer des Kommandos anzugeben:

[user01@aixe01 ~]$ !4
cat sample.txt
This is a test file!
[user01@aixe01 ~]$

(Hinweis: Als erstes wird das Resultat der Erweiterung ausgegeben, hier „cat sample.txt“, danach kommt die Ausgabe des ausgeführten Kommandos.)

Die Eingabezeile wird gelesen („!4“), aufgrund des Vorkommens des Zeichens „!“ in der Eingabe wird erkannt, das eine History Erweiterung notwendig ist. Die Zeichenfolge „!4“ ist ein sogenannter Bezeichner für ein Kommando in der History (Event Designator). Diese wird bei der Erweiterung (Expansion) durch das Kommando mit der Nummer 4 ersetzt (in unserem Fall ist das „cat sample.txt“.) Anschließend wird die resultierende Eingabezeile durch die Shell weiter ausgewertet und dann letztlich ausgeführt.

Die Zeichenkette „!4“ bedeutet wesentlich weniger Tipp-Arbeit, als das Kommando „cat sample.txt“. Natürlich könnte man in diesem Fall auch 2 mal die Taste Cursor-Up drücken, liegt das gewünschte Kommando aber schon eine Zeit zurück, müsste man schon ziemlich oft Cursor-Up drücken. Da geht „!4“ deutlich schneller!

Anstelle die absolute Nummer des Kommandos anzugeben, kann man auch angeben wieviele Einträge man in der History zurückgehen muss, um auf das gewünschte Kommando zugreifen zu können. Dazu gibt man hinter dem History Expansion Zeichen „!“ ein Minuszeichen „„ gefolgt von der Anzahl Einträge die in der History zurückgegangen werden soll. Unsere History sieht aktuell so aus:

[user01@aixe01 ~]$ history
    1  ls -l /usr
    2  vi sample.txt
    3  ls -l sample.txt
    4  cat sample.txt
    5  cp sample.txt sample.txt.bak
    6  history
    7  cat sample.txt
    8  history
[user01@aixe01 ~]$

Der letzte Aufruf von „cat sample.txt“ liegt 2 Kommandos zurück. D.h. mit „!-2“ kann auf dieses Kommando zugegriffen werden:

[user01@aixe01 ~]$ !-2
cat sample.txt
This is a test file!
[user01@aixe01 ~]$

Relativ häufig tritt der Fall auf, das das letzte Kommando noch einmal gestartet werden soll. Das kann nach dem bisher gesagten durch Angabe von „!-1“ erfolgen. Da dies aber häufiger vorkommt, gibt es hierfür eine eigene Abkürzung, nämlich „!!“:

[user01@aixe01 ~]$ !!
cat sample.txt
This is a test file!
[user01@aixe01 ~]$

Für die letzten Kommandos erinnert man sich unter Umständen in welcher Reihenfolge diese ausgeführt wurden und kann sich durch die relative Angabe „!-n“ auf diese beziehen. Für Kommandos die länger zurückliegen, dürfte das aber in der Regel nicht der Fall sein. Außer jemand hat ein extrem gutes Gedächtnis. Daher gibt es die Möglichkeit nach einem Kommando zu suchen. Dazu gibt man nach dem „!“ das in Frage kommende Kommando (oder einen Teil davon an). Der History-Mechanismus sucht nach dem letzten Kommando, das mit der angegebenen Zeichenkette anfängt. Z.B. das letzte Kommando das mit „ca“ angefangen hat:

[user01@aixe01 ~]$ !ca
cat sample.txt
This is a test file!
[user01@aixe01 ~]$

Wurden nach dem gewünschten Kommando, hier „cat sample.txt“, weitere cat-Kommandos mit anderen Argumenten aufgerufen, wird der Fall schon etwas schwieriger. Wir gehen von der folgenden History aus:

[user01@aixe01 ~]$ history
    1  ls -l /usr
    2  vi sample.txt
    3  ls -l sample.txt
    4  cat sample.txt
    5  cp sample.txt sample.txt.bak
    6  cat sample.txt
    7  cat start.ksh
    8  cat stop.ksh
    9  ls -l
   10  history
[user01@aixe01 ~]$

Nocheinmal ausgeführt werden soll das Kommando mit der Nummer 6 („cat sample.txt“). Die Angabe „!ca“ von oben würde jetzt das Kommando 8 („cat stop.ksh“) ausführen, da dieses das letzte Kommando ist, welches mit der Zeichenkette „ca“ beginnt. Auch die Verwendung von „!cat“ führt zur Ausführung von „cat stop.ksh“ und nicht „cat sample.txt“:

[user01@aixe01 ~]$ !cat
cat stop.ksh sa
this is stop.ksh
[user01@aixe01 ~]$

Bei der History Erweiterung gibt es die Möglichkeit nach einer Zeichenkette an beliebiger Stelle eines Kommandos zu suchen. Dazu wird die Such-Zeichenkette zwischen zwei Fragezeichen „?“ angegeben. Eine Suche nach der Zeichenkette „sam“ oder auch „sample“ an beliebiger Stelle im Kommando führt dann zum gewünschten Kommando mit der Nummer 6 („cat sample.txt“):

[user01@aixe01 ~]$ !?sam?
cat sample.txt
This is a test file!
[user01@aixe01 ~]$

Hinweis: Wenn nach dem zweiten Fragezeichen unmittelbar ein Newline folgt, dann darf das zweite Fragezeichen auch weggelassen werden. Man kann also dann kürzer „!?sam“ tippen.

Mit diesen History Ereignis Spezifizierern kann auf bequeme und einfache Weise auf beliebige vergangene Kommandos zugegriffen werden.

Hier nochmal alle Möglichkeiten zusammengefasst:

    • !n  Das Kommando mit der Nummer n.
    • !-n Das Kommando n Positionen vor dem aktuellen Kommando
    • !! Das letzte Kommando, Abkürzung für !-1
    • !string  Das letzte Kommando das mit dem angegebenen String beginnt
    • !?string[?] Das letzte Kommando das den angegebenen String enthält