Parent-Ordner eines SymLinks

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
Benutzeravatar
Lalle75
Beiträge: 83
Registriert: 25.10.2015 17:41:00
Wohnort: Ruhrgebiet

Parent-Ordner eines SymLinks

Beitrag von Lalle75 » 17.12.2021 16:12:21

Hallo zusammen.
Ich hoffe die Überschrift ist nicht zu verwirrend. Ich habe eine Frage zum Verhalten des xterm bei der Navigation durch SymLink-Verzeichnisse.

Ich habe eine Verzeichnisstruktur "~/Ordner1/Ordner2/Ordner3" und einen Link auf den 3. Ordner "~/Link -> ~/Ordner1/Ordner2/Ordner3".

Wenn ich mich mit "cd ~/Link" in den Ordner begebe und mit "find .." alle Dateien in ~/ ausgeben lassen möchte, bezieht sich ../ immer auf den Ordner2.
Wechsle ich aber mit cd .. in das höhere Verzeichnis, bin ich wieder in ~/.

Ich bekomme es nicht hin, mit find über den Symlink zurückzugehen. Hat jemand eine Idee, was ich falsch mache?
Zuletzt geändert von Lalle75 am 19.12.2021 15:09:45, insgesamt 3-mal geändert.
Gruß,
Der Lalle

tobo
Beiträge: 1991
Registriert: 10.12.2008 10:51:41

Re: Parent-Ordner eines SymLinks

Beitrag von tobo » 17.12.2021 17:09:21

Lalle75 hat geschrieben: ↑ zum Beitrag ↑
17.12.2021 16:12:21
Ich bekomme es nicht hin, mit find über den Symlink zurückzugehen. Hat jemand eine Idee, was ich falsch mache?
Du machst meiner Meinung nach gar nichts falsch - das funktioniert so einfach nicht. Praktisch (pwd) stehst du nach "cd (-L) Link" vielleich in ~/Link, aber virtuell stehst du in Ordner3. Wenn du jetzt in find (oder auch durch ls ..) auf diesen Startpunkt Bezug nimmst, dann immer auf das virtuelle Verzeichnis Ordner3.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Parent-Ordner eines SymLinks

Beitrag von Meillo » 17.12.2021 17:12:44

Ich habe mir erlaubt den Bezug zu `find' im Titel zu entfernen, da der Effekt nichts mit irgendeinem Programm zu tun hat, sondern generell gilt. Es ist das Gleiche wenn du `ls' verwendest. `cd' scheint das einzige Programm zu sein, das sich anders verhaelt.

Eine Erklaerung: Die anderen Programme behandeln `..' nicht besonders, sondern sie schauen im Verzeichnis nach der Datei namens `..', die ein vom Betriebssystem automatisch verwalteter Hardlink auf das *physische* Parentverzeichnis ist. Diesem Link wird ganz einfach nachgegangen. Das ist fuer dich zwar ueberraschend, aber es ist technisch gesehen klar.

Das Shell-Builtin `cd' nun hat ein bisschen Magie eingebaut und macht es nicht so wie eben beschrieben. Man kann ihm allerdings sagen, dass es sich auch so verhalten soll, wenn man `cd -P' verwendet. Siehe:
Manpage bash(1) hat geschrieben: cd [-L|[-P [-e]]] [dir]
Change the current directory to dir. [...]
The -P option says
to use the physical directory structure instead of
following symbolic links (see also the -P option
to the set builtin command); the -L option forces
symbolic links to be followed. [...]

[...]

pwd [-LP]
Print the absolute pathname of the current working
directory. The pathname printed contains no sym‐
bolic links if the -P option is supplied or the -o
physical option to the set builtin command is
enabled. If the -L option is used, the pathname
printed may contain symbolic links. The return
status is 0 unless an error occurs while reading
the name of the current directory or an invalid
option is supplied.

[...]

set [--abefhkmnptuvxBCEHPT] [-o option-name] [arg ...]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [arg ...]
[...]

-P If set, the shell does not follow symbolic
links when executing commands such as cd
that change the current working directory.
It uses the physical directory structure
instead. By default, bash follows the
logical chain of directories when perform‐
ing commands which change the current
directory.
Die Frage -- d.h. vermutlich deine Frage -- ist nun, ob man die anderen Programme dazu bringen kann, sich auch so zu verhalten wie `cd' das macht.

Ja, das geht indem du nicht `..' verwendest, sondern von `$PWD' das letzte Element abschneidest:

Code: Alles auswählen

:-Q ls -ild1 /tmp /tmp/a /tmp/a/b /tmp/a/b/c /tmp/d
131114 drwxrwxrwt 6 root   root   4096 Dec 17 17:02 /tmp/
204909 drwxr-xr-x 3 meillo meillo 4096 Dec 17 16:48 /tmp/a/
204910 drwxr-xr-x 3 meillo meillo 4096 Dec 17 16:48 /tmp/a/b/
204911 drwxr-xr-x 2 meillo meillo 4096 Dec 17 16:48 /tmp/a/b/c/
156513 lrwxrwxrwx 1 meillo meillo    5 Dec 17 16:48 /tmp/d -> a/b/c/

:-Q cd /tmp/d                                      

:-Q pwd
/tmp/d

:-Q ls -id ..
204910 ../

:-Q echo "$PWD"     
/tmp/d

:-Q echo "${PWD%/*}"  
/tmp

:-Q ls -id "${PWD%/*}"    # Variante 1
131114 /tmp/

:-Q ls -id "$(dirname "$PWD")"    # Variante 2
131114 /tmp/
Anhand der Inodes kannst du sehen wo sich `..' befindet.

Die letzten beiden Befehle sind Alternativen, je nachdem welche Form dir lieber ist.
Use ed once in a while!

Benutzeravatar
Lalle75
Beiträge: 83
Registriert: 25.10.2015 17:41:00
Wohnort: Ruhrgebiet

Re: Parent-Ordner eines SymLinks

Beitrag von Lalle75 » 17.12.2021 17:19:01

Ich hatte schon vermutet, daß .. auf den Hardlink zurückverweist. Dann muß ich mir wohl in Zukunft ein wenig mehr Text in die Batchdateien einbauen.
Besten Dank.
Gruß,
Der Lalle

tobo
Beiträge: 1991
Registriert: 10.12.2008 10:51:41

Re: Parent-Ordner eines SymLinks

Beitrag von tobo » 17.12.2021 17:38:03

Lalle75 hat geschrieben: ↑ zum Beitrag ↑
17.12.2021 17:19:01
Ich hatte schon vermutet, daß .. auf den Hardlink zurückverweist. Dann muß ich mir wohl in Zukunft ein wenig mehr Text in die Batchdateien einbauen.
Aber für .. hat Meillo doch einen schönen Trick für den Symlink gzeigt:

Code: Alles auswählen

find "${PWD%/*}" ...

Benutzeravatar
Lalle75
Beiträge: 83
Registriert: 25.10.2015 17:41:00
Wohnort: Ruhrgebiet

Re: Parent-Ordner eines SymLinks

Beitrag von Lalle75 » 19.12.2021 15:12:21

Ich habe die Überschrift noch mal zurück gesetzt. Das Problem ist nicht gelöst.
Wenn ich mit $PWD aus einer Batchdatei heraus aufrufe, welche ich im Dateiexplorer (nautilus) starte, dann zeigt $PWD immer den HardLink des Verzeichnisses, aber nicht den Soft-Pfad, der im Dateiexplorer angezeigt wird.
Gruß,
Der Lalle

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Parent-Ordner eines SymLinks

Beitrag von Meillo » 31.12.2021 20:58:59

Da es thematisch passt und fuer diejenigen, die deutlich tiefer in das Thema einsteigen wollen bzw. Hintergruende erfahren wollen: In den letzten Tagen gab es einen Thread auf der TUHS-Mailingliste, der dieses Thema auch gestreift hat.

Zusammenfassend kann man sagen, dass es schoen gewesen waere, wenn Unix dieses Problem kernelseitig geloest haette. Da dies nicht der Fall ist, haben wir den vorhandenen Zustand.

Hier wird nochmal beschrieben, dass nur die Shell das manuell nachbearbeitet, um den Anschein zu erwecken: https://minnie.tuhs.org/pipermail/tuhs/ ... 24968.html

Der ganze Thread startet hier: https://minnie.tuhs.org/pipermail/tuhs/ ... 24904.html und geht hier weiter: https://minnie.tuhs.org/pipermail/tuhs/ ... 24960.html

Hier fordert Rob Pike dazu auf, in Unix/Linux dieses Problem zu loesen. Verlinkt ist ein Paper, in dem das Thema in Plan 9 beleuchtet wird. https://minnie.tuhs.org/pipermail/tuhs/ ... 24953.html Der Linux-Kernel-Entwickler Ted T'so ist auch mit von der Partie.

Es ist durchaus ein interessanter Thread ... der urspruenglich gestartet ist bei der Frage, warum man in sehr alten Unix-Versionen Verzeichnisse nicht verschieben/umbenennen kann. Auch ueber die technische Herausforderung, dies zu tun, hat von uns vermutlich kaum einer mal nachgedacht. ;-)
Use ed once in a while!

Antworten