Lektion 6: Bash Advanced

Bis jetzt haben wir nur die Spitze des Eisbergs “Bash” berührt. Die Bash kann noch viel mehr. Diesmal: Klammerauswertung, Shortcuts, History-Navigation Öfters möchte man die Ausgabe eines Programmes als Parameter an ein anderes übergeben. Beispiel: Ich will in mehreren Dateien nach einem Begriff suchen:
grep Suchbegriff *.tex. Klar, klappt einwandfrei. Was, wenn ich aber komplexere Dateieinschränkungen machen möchte? Dann kann ich z.b. folgendes machen: grep Suchbegriff find . *.tex sucht rekursiv in diesem Verzeichnis alle tex-Dateien und “grep”t diese. Alternativ: grep Suchbegriff $(find . *.tex) – damit kann man diese Sub-Kommandos noch verschachteln. Dummerweise gibts da eine Beschränkung der Parameterlänge. Wenn also zu viele Dateien gefunden werden, gibts ein Problem. Ausweg: xargs (man xargs). Beispiel: find . *.tex | xargs grep Suchbegriff.

Ich gebe ab und zu etwas komplexe Befehlsketten ein. Ich habe natürlich keine Lust, die jedes mal neu einzugeben oder lange mit den Cursortasten in der History zu suchen. Lösung: inkrementelle Rückwärtssuche in der History: C-R (Control-R) drücken und Suchbegriff eingeben. Die Kommandozeile wird automatisch ergänzt.
Das letzte Kommando einfach nochmal ausführen? Kein Problem: einfach !! eintippen, fertig. Einfach den letzten ssh-Befehl nochmal ausführen? !ssh, der erste Treffer in der History wird direkt Ausgeführt. Wenn ich doch noch mal sehen will, was da Ausgeführt werden soll, dann tippe ich !ssh:p der Doppelpunkt als Trenner, p für Print. Wenn ich das dann ausführen möchte, einfach !!. Man kann sich ja auch die History anzeigen lassen. z.B mit history | less – da stehen da die Befehle durchnummeriert da. Wenn man einen bestimmten Befehl ausführen möchte – einfach !X wobei X der Nummer entspricht. Nächstes gimmick: man stelle sich vor, ich suche in einer Datei nach einem Begriff. z.B. grep ringehahn /usr/local/etc/apache/httpd.conf und möchte danach diese Datei bearbeiten. Da der Pfad ziemlich lang ist, möchte ich ihn nicht nochmal eintippen. !$ referenziert den letzten Parameter des letzten Befehls. Also ist es nun ein einfaches den Editor aufzurufen: vim !$ – super, oder?
Jetzt hab ich in dem Verzeichnis noch ein paar andere Dateien zu bearbeiten, wie komm ich dahin? Klar, tippen ist keine Option, jeder Informatiker ist ein faules Schwein. Einfach cd !$:h eintippen, fertig. Liste der anhängsel:

h
Pfad ohne Dateiname
t
Dateiname ohne Pfad
r
voller Pfad mit Dateinamen, nur ohne dessen Endung
e
nur die Endung des Dateinamens
Ich möchte nicht das letzte Argument des letzten Befehls, sondern des vorletzten Befehls: echo $-2! Ich habe einen Tippfehler beim letzten Befehl gemacht. z.B. grep ringelhahn /usr/local/etc/apache/httpd.conf und möchte den Befehl nun korrigiert starten: ^elhahn^ehahn und der Befehl wird korrigiert ausgeführt. Prinzip: ^Fehler^Korrektur
Klammerauswertung #2:
Schnell ein Backup einer Datei anlegen? Klar: cp datei datei-bck. Einfacher: cp datei{,-bck}. Backup zurueckkopieren? cp datei{-bck,}. Alles in /usr/local/(s?)bin anzeigen? ls /usr/local/{s,}bin. Alle Dateien verschiedener Typen anzeigen? ls *.{tex,latex,pdf,html}

vieles hier ist eine schamlose Kopie von Deadmans “Advancing in the Bash Shell”

5 Kommentare zu “Lektion 6: Bash Advanced”

  1. Beate

    Super, vielen Dank für die ganzen Tipps! Wenn ich mir das nur alles merken könnte :(

  2. Claus

    Weisst Du vielleicht, wie ich mittels bash von einem ganzen Verzeichnis mit allen Unterverzeichnissen ein Backup mache?

  3. steffi

    ich habe eine aufgabe: ich muss mit hilfe von shell-bash ein programm öffnen, das Hallo Welt sagt und sich dann wieder schliesst! kannst du mir helfen?

  4. chrono

    Zur Frage von Claus – auch wenn es ne weile her ist:
    du suchst tar. man tar.

    steffi: google nach: bash hello world

  5. Marc

    Gute Info.
    Weiter so.
    Gruß Marc

Einen Kommentar schreiben: