Zunächst die Frage: Wie funktioniert das Ganze technisch? Ein `os.stat()` gibt neben anderen Informationen nur den Inode an, zumal der Aufruf meines Wissens ja ohnehin vom Pfad in den Inode übersetzt wird und sozusagen die antwortende Ebene sich nur auf den Inode bezieht. Wo hat der `readlink()`-Aufruf also den Pfad her?
Und als zweites: Kann ich diese Kette auch umkehren? Kann ich z.B. herausfinden, dass `/usr/bin/python2.6` von `/usr/bin/python` referenziert wird?
Hintergrund der Geschichte ist die Symbol-Erkennung von Launchit: Beim Durchgehen der Menü-Einträge merke ich mir für jeden Eintrag ein Tupel, welches den Kommando-Pfad (resp. ausführbare Datei) und den Symbol-Namen für den Eintrag beinhaltet. Die Kommando-Pfade werden mittels launchit.core.get_trimmed() in den Fällen gekürzt, wo sie als absoluter Pfad vorhanden sind, aber ebenso über den reinen Dateinamen erreicht werden können - nämlich dann, wenn das Verzeichnis im $PATH steht. Das (gekürzte) Kommando wird mit dem Symbol-Namen als Wert in ein Wörterbuch zwecks Caching abgelegt.
Das ist alles schön und gut, aber leider kommen mir Verlinkungen in die Quere. Mir ist das vor allem an einer Stelle aufgefallen, wo `update-alternatives` mit im Spiel ist, namentlich bei `policytool`:
Code: Alles auswählen
$ update-alternatives --list policytool
/usr/lib/jvm/java-6-openjdk/jre/bin/policytool
/usr/lib/jvm/java-6-sun/jre/bin/policytoolAls Lösung dafür ist mir bisher nur eingefallen, dass ich versuche, für den Namen (hier: `policytool`) einen Kommandopfad zu erhalten (hatte `is_command()` etwas umgeschrieben) und dann mittels `os.path.samefile()` zu sehen, ob beide Pfade zum selben Inode führen. Das erscheint mir aber irgendwie unsauber, zumal dies für das o.g. `python2.6`-Beispiel nicht funktionieren würde. Ich möchte ungerne auch noch raten, ob Kommandos mit Versionsangabe möglicherweise das selbe tun, wie ein Aufruf ohne die Version.
Was wäre euer Vorschlag zum Lösen des Problems: Sollte ich mir einfach alle Verlinkungen der Dateien aus den Verzeichnissen des $PATH merken und dafür etwas wie `is_alias()` oder so einbauen? Ich habe in der Sache das Gefühl, dass ich eventuell auf dem Holzweg bin - daher frage ich nach...
