Installieren ohne Reue
The Answer Girl
Wie es sein sollte
Um stow erfolgreich einsetzen zu können, gilt es, einige Begrifflichkeiten zu klären. Wenn in der Dokumentation vom stow directory die Rede ist, haben wir es mit dem Verzeichnis zu tun, in dem die Verzeichnisse mit den Dateihierarchien der einzelnen, kompilierten Softwarepakete liegen. Anders ausgedrückt, geht die Vorarbeit für die stow-Nutzung dahin, beim configure-Lauf für ein Softwarepaket jeweils das Präfix Stow-Verzeichnis/Paketname anzugeben. In unserer Planung trägt das Stow-Verzeichnis also den schlichten Namen /opt.
Als nächste Information muss stow wissen, in welche Verzeichnishierarchie hinein es die Inhalte von Stow-Verzeichnis/Paketname verlinken soll. Als target directory eignet sich /usr/local hervorragend, zumal dann, wenn /usr/local/bin bereits im PATH enthalten ist.
Mit den Optionen -t und -d lassen sich Zielverzeichnis und Stow-Verzeichnis angeben, letztere Option kann auch wegfallen, wenn wir uns mit cd /opt ins Stow-Verzeichnis begeben.
Noch müssen wir /opt/stow/bin/stow selbst ordentlich nach /usr/local/bin/stow verlinken, ehe wir es als ohne Pfadangabe aufrufen können. Ein
/opt #./stow/bin/stow -v -v -v -n -t /usr/local stow Stowing package stow… Stowing contents of stow Stowing directory stow/bin Stowing contents of stow/bin LINK /usr/local/bin/stow to ../../../../opt/stow/bin/stow Stowing directory stow/info LINK /usr/local/info to ../../../opt/stow/info
gibt uns die Kontrolle darüber, was mit dem Inhalt des Verzeichnisses stow passieren würde, wenn wir ihn nach /usr/local verlinken wollten: Die Option -n sorgt einstweilen dafür, dass nichts geschieht, während jedes -v ("verbose") das Programm etwas geschwätziger macht; allerdings ist bei Plauderlevel 3 Schluss.
Sofern Verzeichnisse, die unterhalb von ./stow zu finden sind, in /usr/local bislang noch nicht existieren (im Beispiel /usr/local/info), legt das Programm ./stow/bin/stow sie nicht etwa an, sondern macht es sich einfach: /usr/local/info verweist auf /opt/stow/info. Existiert das jeweilige Directory schon (im Beispiel bei /usr/local/bin der Fall), setzt stow darin einen Link auf die entsprechende Datei (/usr/local/bin/stow zeigt auf /opt/stow/bin/stow). Für die Quelldatei gibt stow relative Pfade ausgehend vom Zielverzeichnis an.
Das sieht vernünftig aus, also machen wir mit ./stow/bin/stow -v -t /usr/local stow Nägel mit Köpfen und schauen uns das Ergebnis an:
/opt # ls -Al /usr/local insgesamt 3 drwxr-xr-x 2 root root 55 Nov 26 20:02 bin drwxr-xr-x 2 root root 150 Nov 26 18:28 ftp lrwxrwxrwx 1 root root 22 Nov 26 20:02 info -> ../../../opt/stow/info drwxr-xr-x 2 root root 57 Nov 26 18:28 man
Der Ärger mit den Bugs
Doch ehe wir jetzt voller Euphorie damit beginnen, weitere Software zu verstauen, prüfen wir doch besser erst einmal nach, ob die versprochene Deinstallation mit der Option -D tatsächlich so einfach ist. Wenn /usr/local/bin im Suchpfad liegt, können wir stow jetzt auch ohne Verzeichnisangabe aufrufen:
/opt # stow -v -v -v -n -D -t /usr/local stow Unstowing in /usr/local Unstowing in /usr/local/bin Unstowing in /usr/local/ftp Unstowing in /usr/local/ftp/bin Unstowing in /usr/local/ftp/dev Unstowing in /usr/local/ftp/etc Unstowing in /usr/local/ftp/lib Unstowing in /usr/local/ftp/usr Unstowing in /usr/local/ftp/usr/bin Unstowing in /usr/local/ftp/msgs Unstowing in /usr/local/man
Das sieht komisch aus – warum wird /usr/local/info nie erwähnt? Warum steht da nichts davon, dass /usr/local/bin/stow gelöscht werden soll? Und was hat stow in Unterverzeichnissen wie man und ftp verloren, in die es gar nichts verlinkt hat?
Mutige sichern jetzt die komplette /usr/local-Hierarchie und lassen stow -D nochmals ohne die -n-Option laufen. Doch auch davon wird es nicht besser:
/opt # ls -al /usr/local/bin insgesamt 16 lrwxrwxrwx 1 root root 29 Nov 26 20:02 stow -> ../../../../opt/stow/bin/stow
Der Links sind immer noch da …
Soviel wir auch hin- und herprobieren, irgendwann heißt es, in den sauren Apfel zu beißen und sich einzugestehen: stow ist fehlerhaft und ungenügend getestet. Wirklich funktionieren will es nur, wenn das Stow-Directory mit den Paketunterverzeichnissen ein Unterverzeichnis des Zielverzeichnisses ist.
Wie gut, dass wir noch wissen, was verlinkt wurde:
/opt # rm /usr/local/info /opt # rm /usr/local/bin/stow
Legen wir also ein neues Stow-Verzeichnis stow unterhalb von /usr/local an und packen unser stow-Paketverzeichnis dahin:
/opt # mkdir /usr/local/stow /opt # mv stow /usr/local/stow/



