ftblog

:: widerstand zwecklos ::
email jabber gpgkey
hackergotchi

May 31, 2007

zshrc, yet again

Filed under: computer -- 01:08

An meiner zsh Konfiguration hat sich in letzter Zeit wieder mal ein wenig etwas
getan. Ein paar der Dinge sind sinnvoll und eine Sache ist bekloppt. :-)

Einer der unaufgeräumtesten Teile meiner zshrc war sicherlich die 'alias'
Datei, in der eben Befehls-Aliase sowie Named-Directories definiert wurden.
Dort ging es meinst so: "Existiert der Befehl?" -> "Mache einen Alias damit."
Dazu kam, das gleiche Spiel bei den Named-Directories. Und dazu noch Aliase,
die einen Befehl per 'sudo' aufrufen.

Letztere waren zusätzlich ein wenig nervig, da ich meine Konfiguration ja nicht
nur auf einem Rechner nutze und selbstverständlich nicht überall das Recht habe,
den ein oder anderen Befehl per 'sudo' aufzurufen. So taucht man schon mal in
Log-Dateien auf, weil man unautorisiert Sachen als Superuser machen wollte. :-)

Nun bin ich letztens auf eine Idee zur Lösung des Problems gekommen, als ich für
grmls zshrc die Funktion salias() schrieb, die dort auch das Problem mit den
'sudo' Aliasen löst. Diese salias() Funktion habe ich für mich noch ein wenig
erweitert und noch die zwei Funktionen xalias() und xhashd() geschrieben.

Das Ganze funktioniert ungefähr so:

### einen alias für ls machen, und vorher testen ob ls existiert
% xalias ls='ls --color=auto'

### eine Named-Directory für /usr/src/cmus einrichten
### natürlich nicht ohne vorher zu testen ob das Verzeichnis existiert.
% xhashd cmus=/usr/src/cmus

### einen 'sudo' Alias für ifconfig:
% salias ifconfig='ifconfig'

### wobei salias noch ein wenig mehr kann:
% salias -h
usage: salias [-h|-o|-a|-c|-C] <alias-expression>
  -h      shows this help text.
  -a      replace ' ; ' sequences with ' ; sudo '.
          be careful using this option.
  -o      only sets an alias if a preceding sudo would be needed.
  -c      check $sudo_hosts[] array.
  -C      don't check if the command in the alias exists.
          Use this if the command requires a special check, that.
          check_com() cannot deal with.

Die '-c' Option schaltet das Prüfen des User- und Hostnamens ein, um zu prüfen,
ob die Aliase auf dem Host überhaupt erwünscht sind. Um das zu realisieren, gibt
es den '$sudo_hosts[]' Array, den man wie folgt füllen könnte:

sudo_hosts=(
  foo,bar,baz@beer
  foo@booze
  bar@barney
)

Der '-o' Schalter von salias() ist sinnvoll, wenn man einen solchen Alias machen
würde: alias ifconfig='sudo ifconfig'. Wenn man nun diese Konfig als User sowie
als Superuser einsetzt (was ich nicht tue...) dann macht es für den Superuser
das 'sudo' keinen Sinn, da er eh schon alles darf.

Und mit dem '-a' Schalter kann man mehrere Befehle im Alias mit 'sudo' starten:

### Ergebnis: beer='sudo foo ; sudo bar ; sudo baz'
% salias -a beer='foo ; bar ; baz'

### Ergebnis: beer='sudo foo; bar ; sudo baz'
% salias -a beer='foo; bar ; baz'

Dadurch sieht meine 'alias' Datei wirklich sauberer aus.

Nun zu dem Feature, das auf einen leicht gestörten Geist hinweißt: Ich kann nun
Abhängigkeiten in den einzelnen Teilen meiner gesplitteten zshrc definieren, und
die dafür nötige Reihenfolge, in der diese dann eingelesen wird zur Laufzeit
ermittelt. Somit, kann ich einfach zu lesende Dateien in meine zshrc.real
eintragen, ohne auf die Reihenfolge zu achten (das heisst im Speziellen: ich
kann sie dort geordnet eintragen). Das funktioniert so:
Die erste Zeile meiner Konfigurationsdateien sieht so aus:

#zdep options,vars

Der Rest ist Magie. :-) - Err, nein: Wie's gemacht wird steht in meiner
'zshrc.real'.

Übertriebenes Feature für eine Konfigurationsdatei? Ja, ganz sicher. :-)
Aber ich fand es trotzdem ganz witzig, ein solches anzugehen.

Powered by zblog
valid css | valid xhtml | utf-8 encoded | best viewed with anybrowser