Dr. Linux: Tricks auf der Kommandozeile

Aus LinuxUser 05/2003

Dr. Linux: Tricks auf der Kommandozeile

Besser kommandiert

Dass auf einer Kommandozeile Befehle eingegeben werden, ist normal. Aber mit der Linux-Standard-Shell Bash lassen sich auch Befehle anzeigen und verwalten, Ausgaben umleiten und Hilfe anfordern.

Dr. Linux

Komplizierte Organismen, wie Linux-Systeme es nun einmal sind, haben so ihre ganz eigenen Wehwehchen. Dr. Linux beobachtet die Patienten in den Linux-Newsgruppen, stellt an dieser Stelle Rezepte für aktuelle Probleme aus und alternative Heilmethoden vor.

Befehle verwalten

Dass ich mit den Cursor-Tasten Befehle auf der Kommandozeile zurückholen, verändern und mit [Enter] erneut abschicken kann, finde ich praktisch, besonders wenn’s um schwierige Kommandos geht. Aber lassen sich auch Arbeitsabläufe anzeigen, die aus mehreren hintereinander ausgeführten Befehlen bestehen? Die möchte ich gern abspeichern, um mir bei Bedarf das umständliche “Durchblättern” der Befehls history zu ersparen.

Dr. Linux: Die Linux-Standard-Shell Bash bringt das Builtinfc (fix command) mit, das Befehle, die früher abgesetzt wurden, nachträglich anzeigt. Einzige Voraussetzung: Sie müssen sich in der .bash_history befinden.

perle@suse:~> type fc
fc is a shell builtin

Zusammen mit der Option -l (list) gibt fc die letzten 17 Befehle nummeriert aus. Die Ziffer am Zeilenanfang entspricht der laufenden Nummer, die das Kommando aktuell in der .bash_history trägt:

perle@suse:~> fc -l
483      fc -ln -5 >>test.txt
484      cat test.txt
[…]
496      minicom
497      exit
498      fc -ln -8
499      history

Eine bestimmte Anzahl alter Befehle, beispielsweise die letzten fünf, listet fc, wenn Sie die gewünschte Menge mit einem Minuszeichen versehen mit angeben:

perle@suse:~> fc -l -5
496      minicom
497      exit
498      fc -ln -8
499      history
500      fc -l

Auch Befehlsfolgen, die schon länger zurückliegen, können Sie sich anzeigen lassen. Als Argument werden dabei die Nummern des ersten und des letzten anzuzeigenden Kommandos eingegeben:

fc -l Erste_Befehlsnummer Letzte_Befehlsnummer

Das sieht zum Beispiel so aus:

perle@suse: ~> fc -l 311 312
311      test -e /tmp/test.txt
312      echo $?

Der Befehl Nummer 311 stellt fest, ob die Datei /tmp/test.txt existiert. Leider gibt das test-Kommando keine Rückmeldung auf der Kommandozeile. Ob die Datei nun wirklich vorhanden ist, finden Sie heraus, indem Sie den Rückgabewert des Befehls erfragen: 0 bedeutet, dass es das File gibt. Diese Abfrage übernimmt das Kommando echo $?, das Sie sicher nicht jedesmal im Buch nachschlagen wollen, wenn Sie es einmal aller Monate brauchen.

Stellt sich nur noch die Frage, woher Sie die für den Gebrauch von fc benötigten Befehlsnummern bekommen. Die gesamte gespeicherte History der Shell mitsamt den Zahlen listet der Befehl history (Abbildung 1).

In dessen Ausgabe lässt sich besser navigieren, wenn Sie sie mit history | less an das Programm less verfüttern. Mit dem Schrägstrich und nachfolgender Angabe eines Suchbegriffs können Sie die History so sogar durchsuchen. Die [q]-Taste schließt die Anzeige.

Abbildung 1: Der Befehl history zeigt alle Kommandozeilen-Eingaben durchnummeriert an

Abbildung 1: Der Befehl history zeigt alle Kommandozeilen-Eingaben durchnummeriert an

Wenn Ihnen die Nummern in der fc-Ausgabe lästig sind (Sie wollen sie im Falle der Weiterverarbeitung sowieso löschen), nutzen Sie neben der Option -l auch noch -n (“no numbers”):

perle@suse:~> fc -ln 311 312
         test -e /tmp/test.txt
         echo $?

Bleibt die Frage, wie Sie die Ausgaben von fc in eine Textdatei bekommen. Dafür sorgt die Option -e: Sie lädt das Ergebnis in einen Editor, und zwar standardmäßig in den vi. Wenn Sie lieber einen anderen hätten, erweitern Sie Ihren fc-Befehl nach folgendem Muster:

fc -e Editorname Erste_Befehlsnummer Letzte_Befehlsnummer

Leider hat diese nützliche Option einen entscheidenden Nachteil: Nach dem Beenden des Editors führt fc alle ausgegebenen Befehle direkt aus. Das passiert auch, wenn Sie fc ohne Optionen aufrufen. Hier wird die davor abgeschickte Befehlszeile in den Default-Editor vi geladen und nach dem Verlassen desselben ausgeführt.

Da vi sich nicht gerade intuitiv erschließt, finden Sie im Kasten 1 eine Kurzanleitung für den Notfall.

Kasten 1: Notfallanleitung für den Umgang mit vi(m)

fc ist nicht der einzige Befehl, der den vi als Default-Editor einsetzt. Daher ist dieses Programm in jedem Fall mehr als einen Blick wert. Linux-User bekommen in der Regel nicht das Original, sondern einen vi-Klon wie vim zu sehen, der zusätzlich zur “normalen” vi-Funktion noch einiges mehr kann.

Wenn fc den vi öffnet, befinden Sie sich im sogenannten Befehlsmodus (“command mode”). Hier können Sie den Editor gleich wieder verlassen, indem Sie :q! eintippen. Der Befehl bedeutet für den vi: Beende dich (“quit”) und verwirf die Änderungen (“!“). Dabei springt der Cursor beim Eingeben des Doppelpunkts in die letzte Bildschirmzeile.

Text eingeben oder verändern können Sie im Befehlsmodus nicht direkt, dafür aber mit den Cursor-Tasten hin- und herfahren. Unten links am Bildschirmrand zeigt der vi das Verzeichnis (/tmp/) und den Dateinamen (hier bash-fc-1987844619) der Datei an, die Sie gerade bearbeiten:

/tmp/bash-fc-1987844619: 1 lines, 14 characters.

Um diese temporäre Datei zu speichern (“write”) (und anschließend im Lieblingseditor weiterzubearbeiten), sagen Sie :wq. Das q in diesem vi-Befehl sorgt dafür, dass sich der Editor anschließend beendet.

Um stattdessen Text einzufügen, tippen Sie auf Ihrer Tastatur i (“insert”). Damit wechselt der Editor in den Einfügemodus. Das Eintippen eines Doppelpunkts wird darin nicht als Befehl, sondern als Texteingabe behandelt.

Zum Speichern der neu erstellten Datei geht es mit der [Esc]-Taste zuerst zurück in den Befehlsmodus. Soll das File einen neuen Namen bekommen, sagen Sie :w Dateiname zum Speichern im aktuellen Arbeitsverzeichnis oder :w /Verzeichnis/Dateiname zum Ablegen in einem Verzeichnis Ihrer Wahl. Die Bestätigung gibt es wieder unten links am Bildschirmrand:

"/tmp/test.txt" [Neu] 1L, 18C geschrieben

Detaillierte Ausführungen zum vi bietet unter anderem http://www.openoffice.de/linux/buch/vi.html. http://www.linuxfibel.de/vi.htm beschreibt vim in aller Ausführlichkeit.

Wer sich das Ausführen der ausgegebenen Befehle sparen will, greift zur Ausgabeumlenkung der Shell: Wenn Sie die Ausgabe eines Befehls statt auf den Bildschirm (Standardverhalten) in eine Datei schreiben wollen, brauchen Sie einfach einen Pfeil (das “Größer-als-Zeichen” >) und einen Dateinamen. Die Bash erstellt dann eine neue Datei mit dem angegebenen Namen, in der die Ausgabe zu finden ist. Aber Vorsicht, wenn es bereits ein gleichnamiges File gibt, wird dessen Inhalt überschrieben. In diesem Fall ist es günstiger, das doppelte >> zu nutzen, das Ausgaben an eine bestehende Datei anhängt:

perle@suse:~> fc -ln 311 312 > Befehlslexikon.txt
perle@suse:~> fc -l 311 312 >> Befehlslexikon.txt
perle@suse:~> cat Befehlslexikon.txt
         test -e /tmp/test.txt
         echo $?
311      test -e /tmp/test.txt
312      echo $?

Im Beispiel erstellt die Shell die Datei Befehlslexikon.txt, die die Ausgabe von fc -ln 311 312 enthält. Anschließend wird die gleiche Ausgabe, zur Veranschaulichung diesmal mit der Nummerierung aus der History, angehängt. Der Befehl cat gibt die so erweiterte Textdatei Befehlslexikon.txt auf der Kommandozeile aus.

Genug ist nicht genug

In der History der Bash finde ich zwar die Befehle wieder, die ich eingegeben habe, aber nicht die Ausgaben, die diese Kommandos geliefert haben. Kann ich die auch irgendwo abrufen?

Dr. Linux: Ob Sie umfangreiche Arbeiten nachvollziehbar speichern oder einfach eine Gedächtnisstütze anlegen wollen – in jedem Fall bietet der Befehl script die Möglichkeit, Ihre Eingaben auf der Kommandozeile und die Ausgaben, die diese Befehle liefern, zu protokollieren. Geben Sie den Befehl script in einer Shell ein, erhalten Sie die freundliche Auskunft: Script wurde gestartet, die Datei ist typescript. Je nach System kommt diese Meldung eventuell in englischer Sprache daher (Abbildung 2).

Die Datei ist typescript” bedeutet schlicht und ergreifend, dass die nun folgenden Ein- und Ausgaben in der Datei typescript im aktuellen Arbeitsverzeichnis gespeichert werden. Damit script diese tatsächlich anlegen kann, ist es sinnvoll, den Befehl im Home-Verzeichnis zu starten und erst danach ggf. in andere Verzeichnisse zu wechseln. Auch das spätere Auffinden der Datei erleichtern Sie sich so. Existiert typescript bislang nicht, wird die Datei angelegt; existiert sie bereits, wird sie überschrieben. Danach merken Sie nichts mehr von script: Der Protokollant läuft still und leise im Hintergrund, und Sie können wie gewohnt in der Shell arbeiten.

Wenn Ihnen der Name der Protokolldatei nicht passt, geben Sie script Ihren Wunsch beim Start einfach mit auf den Weg:

script Name_der_Protokolldatei
Abbildung 2: Der Befehl cat zeigt den Inhalt der Datei typescript auf der Kommandozeile an

Abbildung 2: Der Befehl cat zeigt den Inhalt der Datei typescript auf der Kommandozeile an

Um die Protokolliererei zu beenden, verwenden Sie die Tastenkombination [Strg-D] oder den Befehl exit. Auf der Kommandozeile erscheint daraufhin die Bestätigung Script wurde beendet, die Datei ist typescript.

Diese unter Umständen zu beträchtlicher Größe angewachsene Protokolldatei lässt sich mit dem Editor Ihrer Wahl zwar betrachten, aber Freude wird Ihnen das nicht bereiten: Sie enthält Steuerzeichen, die auf der Kommandozeile u. a. dazu dienen, Ein- und Ausgaben richtig darzustellen. Daher nutzen Sie zum Lesen der Datei ein Tool, das diese Steuerzeichen versteht, die Kommandozeile:

perle@suse:~> cat typescript
»Script« wurde gestartet: Wed Mar  5 14:53:47 2003
[…]
»Script« beendet: Wed Mar  5 14:53:55 2003

An Beginn und Ende des Files fügt script Datum und Uhrzeit ein. Wer dazwischen stöbert, merkt aber auch, dass manchmal etwas fehlt: die Ausgabe eines less-Kommandos zum Beispiel, die auch aus dem Kommandozeilenfenster verschwindet, sobald man less beendet. Sie zeigt less typescript zwar mit an, aber dann sind eben auch die Steuerzeichen wieder mit von der Partie…

Gehupft wie gesprungen

Oft will man nach einem Verzeichniswechsel wieder ins vorherige Verzeichnis zurück. Da gibt es doch sicher einen Trick, mit dem das schneller geht als durch erneute, mühselige Eingabe von cd samt des neuen alten Ziels.

Dr. Linux: Zum Hin- und Herbewegen zwischen zwei Verzeichnissen eignet sich der Befehl cd -, und der erklärt sich am besten an einem Beispiel. Nehmen wir an, die Anwenderin befindet sich im Verzeichnis /etc/news/leafnode und wechselt nun mit dem Befehl cd (“change directory”) in den Ordner /etc/ppp/ip-up.d, um dort eine Datei zu bearbeiten:

perle@woody:/etc/news/leafnode$ cd /etc/ppp/ip-up.d
perle@woody:/etc/ppp/ip-up.d$

Will sie jetzt noch einmal nach /etc/news/leafnode zurückkehren, kommt der Befehl cd - zum Einsatz:

perle@woody:/etc/ppp/ip-up.d$ cd -
/etc/news/leafnode
perle@woody:/etc/news/leafnode$

Er zeigt das Verzeichnis an, in dem sie sich zuletzt befunden hat, und springt gleich dahin zurück. Anders ausgedrückt: Mit cd - kommen Sie immer zum “Verzeichnis minus 1”, also dem zuvor besuchten.

Vorwärts, rückwärts

Mit welcher Option bringe ich cat dazu, mir Dateien in umgekehrter Reihenfolge auszugeben, also mit der letzten Zeile zuerst?

Dr. Linux: Der Befehl cat kann das nicht, dafür gibt es einen Befehl, der schon durch seine Schreibweise andeutet, dass er genau das Gegenteil von cat macht, nämlich tac:

perle@woody:~$ cat test.txt
 Erste  Zeile
 Zweite Zeile
 Dritte Zeile
 Vierte Zeile
perle@woody:~$ tac test.txt
 Vierte Zeile
 Dritte Zeile
 Zweite Zeile
 Erste  Zeile
perle@woody:~$

Welche Optionen ein Programm mitbringt, lässt sich in den meisten Fällen auch auf der Kommandozeile erfragen. Dazu geben Sie dem Programmaufruf die Option --help mit (siehe Listing 1). Ausführliche Informationen bieten die sogenannten Manpages, ein Teil der Online-Hilfe, die jedes Linux mitbringt. Diese sehen Sie mit dem Befehl man Programmname ein; die Betätigung der [q]-Taste bringt Sie wieder an den Shell-Prompt zurück. (In den meisten Fällen sorgt less hinter den Kulissen für die Anzeige.) Wenn Sie diese Online-Dokumentation noch nicht kennen, lohnt es, mit man man einen Blick in die Manpage zu man zu werfen.

Listing 1

Hilfe anfordern am Beispiel von cat

perle@suse:~> cat --help
Benutzung: cat [OPTION] [DATEI]…
Verkette DATEI(en) oder Standardeingabe auf Standardausgabe.
  -A, --show-all           äquivalent zu -vET
  -b, --number-nonblank    numeriere nichtleere Ausgabezeilen
  -n, --number             numeriere alle Ausgabezeilen
[Aus Platzgründen gekürzt]
  -s, --squeeze-blank      nie mehr als eine einzige Leerzeile
      --help               gib diese Hilfe aus und beende das Programm
      --version            gib Versionsinformation aus und beende das Programm
Ohne DATEI oder wenn DATEI ist -, lies Standardeingabe.
Melde Fehler an <bug-textutils@gnu.org>.
perle@suse:~>

Glossar

history

Moderne Kommandozeileninterpreter wie die Bash speichern die eingegebenen Befehle (zumindest bis zu einer gewissen Anzahl). Sie merken sich also ihre Geschichte, auf Englisch “History” genannt.

Bash

Unter Linux kommt als Kommandozeileninterpreter in der Regel die “Bourne Again Shell” zum Einsatz. Dieser Programmtyp wird “Shell” (“Muschel”, “Schale”) genannt, weil er den Betriebssystemkern (“Kernel”) umschließt. Kommandozeilenbefehle gibt die Benutzerin nicht direkt an den Kernel zur Ausführung, sondern nimmt dabei die Hilfe der Shell in Anspruch. Ob man direkt an einer virtuellen Linux-Konsole oder in einem Kommandozeilenfenster (X-Terminal) wie xterm oder konsole arbeitet – darin läuft immer eine Shell.

Builtin

Ein Builtin ist ein eingebauter Befehl, den (in diesem Fall) die Shell “mitbringt”. Ob es sich bei einem Kommando um ein Builtin oder um ein eigenständiges Binärprogramm handelt, verrät das Bash-Builtin type:

.bash_history

Die im Home-Verzeichnis versteckte Datei .bash_history speichert die Befehle, die auf der Bash abgesetzt wurden. Voreingestellt ist meist der Wert 500, das heißt, sobald diese Grenze erreicht ist, werden jeweils der/die ersten Befehl(e) aus der Datei gelöscht, um für die “neuen” Befehle am Ende der Datei Platz zu schaffen.

LinuxUser 05/2003 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben