Tipps & Tricks

Seiten Bereiche

Einleitung

Wenn man längere Zeit mit Linux arbeitet, sammelt man die eine oder andere Kleinigkeit, mit der man sich das CLI-Leben vereinfachen kann.

Auch bei mir haben sich einige angesammelt. Da ich jedaoch auch nur ein Mensch bin und ungenutztes Wissen vergesse, schreibe ich einige davon hier auf.

Zusätzlicher Vorteil: Andere können diese ebenfalls nutzen ;-)

Zusätzlicher Hinweis

Einige dieser Tips und Tricks sind Problemlösungen, die ich im Internet gefunden und an meine Bedürfnisse angepasst habe. Genaue Quellen kann ich beim Besten Wissen nicht nennen.

Genug geschrieben! Es geht los mit Hilfstexte für Makefiles

Hilfstexte für Makefiles

Nein, ich werde nicht erklären wie Makefiles arbeiten bzw wie man sie erstellt.

Allerdings kann man sie nutzen, um einfache Routine-Aufgaben zu automatisieren. Für meine Makefiles verwende ich folgende Vorlage:

.PHONY all help

all: help ## Default target

help: ## Show usable targets
        @awk '/^[^\t].*##/ {print $$1;sub(/^.*##/,"   ");print}' Makefile

Eigentlich nur ein ganz normales Makefile ... der einzige Unterschied ist, das alle Ziele, die man direkt nutzen kann mit ## enden.

Wenn man mit

make help

das Ziel help aufruft, macht der awk-Einzeiler folgendes

Im nächsten Abschnitt zeige ich ein etwas ausführlicheres Beispiel: Ein Makefile für TexLive

Makefile für TexLive

Makefiles für TexLive zu schreiben ist nicht einfach. Glücklicherweise gibt es Werkzeuge, die man stattdessen nutzen kann. Dabei kann man sich diese Werkzeuge mit einem einfachen Makefile noch weiter vereinfachen.

Eines dieser Werkzeuge ist latexmk . Dieses sollte bei einer normalen TexLive-Installation dabei sein.

Zusätzlich nutze ich noch mupdf für die Vorschau. Dieses Programm ist nicht Teil von TexLive und muss separat installiert werden.

Für die Zusammenarbeit zwischen diesen Werkzeugen gibt es folgende Konfigurationsdatei im $HOME-Verzeichnis:

.latexmkrc
$pdf_update_method = 2;
$pdf_previewer = "start mupdf %S";
$pdf_mode = 1;

Und natürlich ein Makefile:

Makefile
SRC = source.tex
DST = $(SRC:.tex=.pdf)
OPTIONS = -pdf

.PHONY: all pdf clean clean-all watch

all: pdf ## Default target

help: ## Show usable targets
    @awk '/^[^\t].*##/ {print $$1;sub(/^.*##/,"   ");print}' Makefile

clean: ## Removes everything leaving only the source files
    @for f in $(SRC); do latexmk ${OPTIONS} -c $$f; done

watch: ## Create and show the PDF file, updating it if the source changes
    @latexmk ${OPTIONS} -pvc $(wildcard *.read.tex)

pdf: $(DST)

%.pdf: %.tex
    @latexmk ${OPTIONS} $<
    @latexmk ${OPTIONS} -c $<

Die SRC -Variable enthält den Dateinamen der Quell-Datei.

Die letzten beiden Ziele sind für Make selbst, alle anderen für den Benutzer. Und das Makefile kann einem sagen, wofür diese gut sind:

make help

Das Ziel watch ist dabei so etwas wie das "Arbeitstier" des Makefiles, erlaubt es doch eine Vorschau, mit Überwachung der Quell-Datei. Bei Änderungen wird die PDF-Datei neu gebaut und die Anzeige aktualisiert.

Was auch interessant ist: Wenn die Quell-Datei weitere Dateien über \input{} oder \include{} einbindet, werden diese ebenfalls auf Änderungen überwacht.

Und wer statt pdflatex lieber lualatex verwenden möchte, ändert die Variable OPTIONS:

OPTIONS = -pdflua

Weitere mögliche Optionen zeigt einem

latexmk --help

Und falls jemand glaubt, das man das help Ziel in Makefiles für nichts anderes nutzen kann ... der irrt. Näheres in Bash - Vervollständigung für Makefiles

Bash - Vervollständigung für Makefiles

Man kann eine Variante des AWK-Aufrufs aus dem Makefile zur Vervollständigung in der bash nutzen. Hier mal die Zeile:

complete -W '$([ -f Makefile ] && awk -F: "/^[^\t].*##/ {print \$1}" Makefile)' make

Erklärung

Mit der Option -W wird der Shell eine Wortliste für den dahinter angegebenen Befehl angegeben.

Nur das es in diesem Fall keine statische Wortliste ist, sondern eine dynamisch erstelle Liste. Die einfachen Anführungszeichen sind notwendig um zu verhindern, das die enthaltenen Befehle sofort ausgeführt werden.

Zum Befehl selbst:

Der complete Befehl funktioniert so nur, wenn überhaupt ein Makefile vorhanden ist und so geschrieben ist, wie es im complete Befehl steht.

Man kann diese Art, den complete Befehl zu nutzen auch anderweitig verwenden ... zB zur

Vervollständigung für SSH

BASH + SSH - Vervollständigung von Hostnamen

Eine Variante des complete Befehls wäre folgende:

complete -W '$(awk "/^[hH]ost/ {print \$2}" $HOME/.ssh/config)' ssh

Hier sucht awk nach Zeilen in der Datei $HOME/.ssh/config die mit "host" oder "Host" anfangen und liefert das Wort danach zurück.

Über die Option Hostname bekommt der SSH-Client dann den Namen des eigentlichen Ziels.

Man kann die Vervollständigung auch für eigene Scripte nutzen.

Bash - Vervollständigung für eigene Scripte

Einige meiner Shell-Scripte sind nach dem gleichen Muster aufgebaut:


case $1 in
    befehl1)
        ...
        ;;
    befehl2)
        ...
        ;;
    *)
        echo ...
        ;;
esac

Um diese etwas einfacher nutzen zu können, habe ich folgendes hinzugefügt:

    complete)
        echo "befehl1 befehl2"
        ;;

Und wenn ich jetzt noch meine .bashrc um folgende Zeile erweitere (wobei script.sh der Dateiname des Scripts ist und sich dieses im Suchpfad befinden muss):

complete -W "$(script.sh complete)" script.sh

Je nachdem ob man einfache oder doppelte Anführungszeichen verwendet wird die Wortliste bei jeder Vervollständigung oder nur beim Starten der Shell erzeugt.

Man sollte allerdings beim Hinzufügen neuer Befehle im Script nicht vergessen, die Ausgabe beim "complete"-Befehl zu ergänzen ...