Under Construction

Die Optionen histreedit und histverify

Um die beiden bash Optionen histreedit und histverify zu demonstrieren, gehen wir von der folgenden History aus:

[user01@aixe01 ~]$ history
    1  pwd
    2  ls
    3  date
    4  ls -l long_file_name.txt
    5  who
    6  ls working_copy_of_sample.txt
    7  ls
    8  pwd
[user01@aixe01 ~]$

Es sollen die Inhalte der beiden Dateien long_file_name.txt und working_copy_of_sample.txt konkateniert und in der Datei combined.txt abgespeichert werden. Das Kommando hierzu wäre:

cat long_file_name.txt working_copy_of_sampel.txt >combined.txt

Das ist ziemlich viel Tipparbeit! Schaut man sich die History an, sieht man das beide Dateien schon als Argument in Kommandos vorkamen. Den Dateinamen long_file_name.txt erhält man über die History Erweiterung „!?long?:2“, den Dateinamen working_copy_of_sample.txt über die History Erweiterung „!?work?:1“. Mit Verwendung der History Erweiterung könnte man also folgendes Kommando verwenden:

cat !?long?:2 !?work?:1 >combined.txt

Dies ist um einiges kürzer als das ausgeschriebene Kommando oben.

Hinweis: Das geht natürlich noch kürzer mit „!4:2“ und „!6:1„, aber es geht hier nicht um die kürzeste Variante.

Aber auch bei Verwendung der History Erweiterung können uns natürlich auch Fehler unterlaufen. Wir zeigen dies, indem wir beim zuletzt genannten Kommando bei „work“ den Buchstaben „o“ (aus Versehen) weglassen:

[user01@aixe01 ~]$ cat !?long?:2 !?wrk?:1 >combined.txt
-bash: !?wrk?: event not found
[user01@aixe01 ~]$

Die bash gibt eine entsprechende Fehlermeldung und wir sehen natürlich sofort unseren Fehler (fehlendes „o“). Allerdings kann man nun leider nicht mehr auf das Kommando zugreifen und den Fehler korrigieren. Die Kommandozeile muss neu eingegeben werden. Abhilfe schaft hier die bash Option histreedit (bei Verwendung von readline). Ist die Option histreedit gesetzt und eine History Erweiterung schlägt fehlt (wie im Beispiel oben), dann wird die eingegebene Zeile erneut angezeigt und kann korrigiert werden:

[user01@aixe01 ~]$ shopt -s histreedit
[user01@aixe01 ~]$ cat !?long?:2 !?wrk?:1 >combined.txt
-bash: !?wrk?: event not found
[user01@aixe01 ~]$ cat !?long?:2 !?wrk?:1 >combined.txt

Jetzt kann der fehlende Buchstabe ganz leicht eingefügt, und das Kommando erneut gestartet werden:

[user01@aixe01 ~]$ cat !?long?:2 !?work?:1 >combined.txt
cat long_file_name.txt working_copy_of_sample.txt >combined.txt
[user01@aixe01 ~]$

Stellen wir uns als nächstes vor, das die Datei working_copy_of_sample.txt nun nicht mehr gebraucht wird und gelöscht werden soll. Über die History Erweiterung „!?work?:2“ (oder kürzer „!:2“) haben wir Zugriff auf den Dateinamen und können ihn als Argument bei rm angeben:

rm !?work?:2

Stellen wir uns weiter vor, das wir uns bei Angabe der Argumentnummer verzählt haben und anstelle von „2“ die „1“ verwendet haben:

[user01@aixe01 ~]$ rm !?work?:1
rm long_file_name.txt
[user01@aixe01 ~]$

Es wurde die falsche Datei gelöscht! Das Kommando wird nach der History Erweiterung zwar noch angezeigt, aber dann sofort ausgeführt. Wir sehen sofort das bei der History Erweiterung der falsche Dateiname herausgekommen ist, können die Aktion aber nicht mehr stoppen.

Auch hierfür gibt es eine bash Option, mit der das Verhalten der bash angepasst wird. Wird die bash Option histverify gesetzt, dann werden Kommandos nach der History Erweiterung zunächst nur angezeigt und nicht sofort ausgeführt. Der Nutzer hat dann Gelegenheit das Resultat der Ersetzung zu korrigieren:

[user01@aixe01 ~]$ shopt -s histverify
[user01@aixe01 ~]$ rm !?work?:1
[user01@aixe01 ~]$ rm long_file_name.txt

Der Vorteil ist, das man nun vor der Ausführung sehen kann, was denn eigentlich genau nach der History Erweiterung ausgeführt wird. Allerdings muss man nun jedes auszuführende Kommando nach der History Erweiterung durch Drücken der ENTER-Taste bestätigen. (Das gilt natürlich nicht für Kommandos die keine Zeichen der History Erweiterung enthalten.)

Möchte man die beiden vorgestellten bash Optionen verwenden, sollten diese wieder in eine bash Start-Datei eingetragen werden. Wie gehabt verwenden wir ~/.bashrc:

[user01@aixe01 ~]$ cat ~/.bashrc

shopt –s histreedit

[user01@aixe01 ~]$