Warum Baumbefehl Symlink als rekursiv markieren?

302
KaHa

Ich habe den folgenden Verzeichnisbaum:

. └── aaa └── bbb └── ccc 

Und erstellen Sie Symlink:

ln -s ~/test/aaa/bbb slink 

Danach führe ich den Baumbefehl aus:

tree -l 

und sehen

. ├── aaa │   └── bbb │   └── ccc └── slink -> /home/kaa/test/aaa/bbb [recursive, not followed] 

Warum Slink als rekursiv markiert? Ist es ein Fehler oder missverstehe ich etwas?

2

1 Antwort auf die Frage

2
slhck

Sie haben die -lOption genutzt:

Folgt symbolischen Links, wenn sie auf Verzeichnisse verweisen, als wären es Verzeichnisse. Symbolische Verknüpfungen, die zu Rekursion führen, werden beim Erkennen vermieden.

Nun, der Grund, warum diese Warnung ausgegeben wird, ist nicht, dass sie tatsächlich wiederkehren würde. Wir können deutlich erkennen, dass der bbb/cccBaum einfach erneut aufgelistet wird.

Ich schätze, dass das eigentliche Problem das Halteproblem ist : Der treeBefehl kann nicht wissen, ob er unendlich oft wiederkehren wird oder nicht, und er muss bereits aufhören, wenn er einen Symlink zu einem Verzeichnis entdeckt, das er bereits besucht hat - selbst wenn er diesem Verzeichnis folgt würde nur einen Teilbaum drucken und nicht erneut aufrufen.

Auch wenn Sie vorzeitig oder nach einer vordefinierten Anzahl von Rekursionen anhalten könnten, ist dies alles, um nicht unendlich viel Speicherplatz zu verbrauchen. Zumindest ist das meine Interpretation.

Der entsprechende Code ist hier übrigens. Wenn die Inode-Nummer des Verzeichnisses, auf das der Symlink verweist, in der Hash-Tabelle gefunden wird (die mit saveinound gefüllt ist findino), wird sie einfach übersprungen.

Ja. Sieht so aus, als hätten Sie Recht, auch wenn dies extrem eingängig ist. Um dies zu bestätigen, habe ich einen anderen Baum erstellt: yyy / xxx / zzz plus Symlink "alink" und jetzt: alink -> / home / kaa / test / yyy / xxx slink -> / home / kaa / test / aaa / bbb [rekursiv , nicht gefolgt] KaHa vor 6 Jahren 0