history expansion in bash ------------------------- Mit history expansion kann man schnell ganze oder teile von zeilen aus der history aufrufen und editieren. Am anfang kommt es einem zwar sehr archaisch vor, aber wenn man sich dran gewöhnt hat ist es sehr praktisch. History Expansion funktioniert mit Bash und kommt ursprünglich aus der C-Shell, wo sie (glaube ich) der einzige zugriff auf die history war. Bash bekommt diese funktionalität von der GNU readline-library zur verfügung gestellt. Eine history expansion wird mit "!" eingeleitet. Die einfachsten und am häufigsten angewandten fälle: !! vorherige zeile erneut ausführen !42 zeile "42" ausführen (zeilennummern anschauen mit dem befehl "history" !vim letzte zeile ausführen, die mit "vim" anfängt Es können auch teile einer zeile ausgewählt werden: $ vim file1 file2 $ rm !* rm file1 file2 $ Die 3 möglichen Abschnitte einer history expansion werden mit doppelpunkt getrennt und sind nach rechts hin optional. Allgemeine syntax: 1. zeile festlegen (event) ls !! 2. teile einer zeile zum bearbeiten festlegen (words) wget !wget:* 3. ausgwählte words bearbeiten (modifiers) wget !wget:*:q Anwendungsbeispiel mit allen Abschnitten: $ ls file with spaces ooops, quotes vergessen! $ ls !!:*:q schön kryptisch ls 'file with spaces' wheee! ----- events ----- hiermit wählt man die zeile aus, die bearbeitet werden soll Expansions werden mit '!' eingeleitet !n zeile nr. n (zeilennummern angucken mit "history") !-n n zeilen rückwärts in der history (z.B. "!-2", um den vorletzten Befehl nochmal auszuführen) !! shortcut für !-1 !string zeile, die mit string anfängt (z.B. "!vim" für den letzten aufruf von vim) !?string? zeile, die string beinhaltet ^x^y im letzer zeile x durch y ersetzen (ohne '!', nur 1. vorkommen, auch mehrere buchstaben) !# The entire command line typed so far (??) ------ words ----- hiermit wählt man die elemente der zeile aus, die man bearbeiten möchte vom event trennen mit ':' :^ 1. word (wie ":1") :$ letztes word (grep -i /bla/blubb; vim !$ ----> vim /bla/blubb) :0 0-tes word (der befehl) :n n-tes word (z.B. ":1" für ersten parameter) :n-o n-tes bis o-tes word :% wort vom letzten ?string?-search :* 1tes bis letztes word (=nur argumente) :n* ab n-tem word alles :n- ab n-tem word alles außer letztem ------- modifiers --------- können mehrere sein, von den words trennen mit ':' :h letzte kompenente eines pfades entfernen (/path/to/file.ext -> /path/to) :t alles vor letzter pfadkomponente löschen (/path/to/file.ext -> file.ext) :r dateiendung entfernen (/path/to/file.ext -> /path/to/file) :e alles außer dateiendung entfernen (/path/to/file.ext -> .ext) :s/old/new aus alt mach neu (substitute) :& vorheriges austauschen wiederholen :gs auf der ganzen zeile austauschen :p nur printen und in history abspeichern, nicht in readline laden/ausführen :q selektierte words quoten (') :x wie 'q', aber einzelne words quoten ------------------- Beispiele: $ vim /long/path/to/file $ cd !!*:h cd /long/path/to $ $ ls a b c # können die dateien gelöscht werden? $ rm !* # ja klar! weg mit ihnen! rm a b c $ ls a b c $ vim !!:1 # 1. word auswählen vim a $ ls a b c $ vim !!:$ # letztes word auswählen vim c $ !! --> vorherige zeile erneut ausführen $ !-2 --> vorletzte zeile erneut ausführen $ tar -xzf x.tar.bz2 --> z ist für gz, oops $ ^z^j --> erstes "z" der vorherigen zeile durch "j" ersetzen tar -xjf x.tar.bz2 selbiges für mit-zwischengetippt $ tar -xzf file.tar.bz2 $ ls $ !tar:s/z/j tar -xjf file.tar.bz2 $ vim x.html $ vim bla $ vim blub $ !?html vim x.html --> zeile in der am ende der zeile "html" vorkommt !!:2 2. argument !!:2* ab 2. argument !for:s/gif/jpg/ --> in zeile dir mit 'for' anfängt 'gif' durch 'jpg' ersetzen! ^gif^jpg --> in vorheriger zeile gif durch jpg ersetzen ------------------- Relevante einstellungen in bash 'shopt histverify' legt fest, ob das ergebnis in readline geladen oder direkt ausgeführt wird 'shopt histreedit' legt fest, ob bei fehlschlag die expansion in readline geladen wird mit alt-^ kann die zeile expandiert werden, ohne daß sie ausgeführt wird ("history-expand-line"-makro in readline) --------- man-pages --------- man history man bash /^HISTORY EXPANSION (C) Moritz Orbach 2005, 2011 http://apfelboymchen.net/gnu/ Lizenziert unter der Creative Commons Attribution-ShareAlike 2.0 Lizenz