Under Construction

Editieren mit fc

Häufig befindet sich in der History ein Kommando das geringfügig modifiziert werden muss, bevor es im aktuellen Kontext sinnvoll erneut ausgeführt werden kann. Eventuell muss ein Dateiname angepasst werden, oder eine Option ergänzt oder weggenommen werden. Mit der bash History Erweiterung sind sehr komplexe Ersetzungen möglich. Allerdings muss man alle gewünschten Ersetzungen eintippen, ohne das Resultat gleichzeitig sehen zu können. Bei komplexen Ersetzungen führt dies häufig zu Fehlern und Kommandos die letztlich so nicht gewollt waren.

Hier liegt ein Stärke des Kommandos fc: zurückliegende Kommandos können in einen beliebigen Editor (Default ist vi) geladen werden und dann interaktiv im Editor korrigiert werden, bevor sie dann letztlich ausgeführt werden. Der Editor kann über die Variable FCEDITOR gesetzt werden. Ist FCEDITOR nicht gesetzt, wird die Variable EDITOR herangezogen. Sollte auch diese nicht belegt sein, wird als Default der Editor vi verwendet.

Wir starten mit der folgenden History:

[user01@aixe01 ~]$ history
    1  hostname
    2  pwd
    3  ls
    4  cd /etc
    5  ls -l
    6  cat passwd
    7  cd
    8  pwd
    9  ls -l log*
   10  tail log
   11  tail -30 log
   12  pwd
   13  cd /usr/bin
   14  find . -name "ta*"
   15  which tail
   16  id
   17  cd
   18  ls -l *.old
   19  rm file.old
   20  pwd
[user01@aixe01 ~]$

Das Kommando mit der Nummer 14 (‚find . –name „ta*“‘) soll erneut ausgeführt werden, allerdings soll nun ab „/“ gesucht werden. Über den bash History Erweiterungsmechanismus könnte man das wie folgt realisieren:

!find:s/./\//

Nach Drücken der ENTER Taste wird das Kommando dann zwar kurz angezeigt, aber sofort ausgeführt (außer man verwendet histverify).

Mit Hilfe des Kommandos fc kann man das zurückliegende Kommando bequem in einem Editor bearbeiten und erst ausführen, wenn man alle gewünschten Änderungen gemacht hat:

[user01@aixe01 ~]$ fc find

Die bash ermittelt das letzte Kommando das mit der Zeichenkette „find“ beginnt, speichert dieses Kommando in einer temporären Datei und startet dann einen Editor. Der Benutzer kann das Kommando jetzt abändern:

find . -name "ta*"
~

~
~
~
"/tmp//bash-fc.eM2Med" 1 line, 19 characters

Nach der Änderung muss das Resultat abgespeichert werden (ansonsten wird das ursprüngliche Kommando ausgeführt). Wenn der Editor dann beendet wird, führt das fc Kommando das Kommando aus der temporären Datei aus und löscht diese anschließend:

[user01@aixe01 ~]$ fc find
find / -name "ta*"

/opt/freeware/bin/tabs
/opt/freeware/bin/tabs_32

[user01@aixe01 ~]$

Hinweis: Führt man fc ohne Argumente aus, dann wird das letzte Kommando in den Editor geladen!

Gelegentlich stellt sich beim Editieren eines zurückliegenden Kommandos heraus, das man das Kommando doch nicht ausführen möchte. Man sollte allerdings dann nicht den vi-Editor mit „:q!“ verlassen, da dann die temporäre Datei noch das ursprüngliche Kommando enthält und dieses dann ausgeführt wird.

Für den Fall das man kein Kommando ausführen möchte, bieten sich zwei Möglichkeiten an:

Erstens: Man zwingt den Editor mit einem Exit Code verschieden 0 abzubrechen, bei vim geht das mit „:cq“. Bei vi ist uns keine einfache Möglichkeit bekannt.

Zweitens: Man löscht im Editor einfach das Kommando oder kommentiert es mit einem „#“ aus und verlässt dann den Editor mit Abspeichern.

Der oben beschriebene Editier-Modus funktioniert auch mit einem Bereich von Kommandos! Wir hatten im Kapitel Laden und Speichern der History Kommandos zum Rotieren von Log-Dateien in der Datei logrotate_history abgespeichert. Wir kehren nun zu diesem Beispiel zurück.

Wir laden die History mit den Einträgen aus der Datei logrotate_history:

[user01@aixe01 ~]$ history -r logrotate_history
[user01@aixe01 ~]$ history
    1  hostname
    2  pwd
    3  ls
    4  cd /etc
    5  ls -l
    6  cat passwd
    7  cd
    8  pwd
   9  ls -l log*
   10  tail log
   11  tail -30 log
   12  pwd
   13  cd /usr/bin
   14  find . -name "ta*"
   15  which tail
   16  id
   17  cd
   18  ls -l *.old
   19  rm file.old
   20  pwd
   21  ls /usr/bin/la*
   22  find / -name "ta*"
   23  mv log2 log3
   24  mv log1 log2
   25  mv log log1
   26  touch log
[user01@aixe01 ~]$

Die Kommandos zum Rotieren sind die Kommandos 23 bis 26. Durch Angabe dieses Bereichs als Argument von fc,

[user01@aixe01 ~]$ fc 23 26

werden diese 4 Kommandos in den Editor geladen:

mv log2 log3
mv log1 log2
mv log log1
touch log
~

~
"/tmp//bash-fc.7E2Mek" 4 lines, 48 characters

Hinweis: Natürlich kann man eines oder mehrere der Kommandos noch abändern!

Durch Abspeichern und Verlassen des Editors werden die 4 Kommandos erneut ausgeführt:

[user01@aixe01 ~]$ fc 23 26
mv log2 log3
mv log1 log2
mv log log1
touch log
[user01@aixe01 ~]$

Im Unterschied zur History Erweiterung können mit Hilfe des Kommandos fc auch mehrere Kommandos (Bereich von Kommandos) in einer Operation erneut ausgeführt werden.

Mit Hilfe der Option „-e“ kann man einen Editor angeben, der dann anstelle des gesetzten Editors (vi) verwendet wird.