Ich habe Verzeichnisse ungefähr so eingerichtet
~/code
~/code/src
~/code/build -> /path/to/somewhere/else
Das Letzte ist ein symbolischer Link.
Wenn ich das mache
cd ~/code/build
ls ..
dann bekomme ich die Auflistung für /path/to/somewhere
, aber vonSonstige Anmerkungenund meiner eigenen Erfahrung nach hatte ich erwartet, die Auflistung für ~/code
– ich könnte schwören, dass es früher andersherum funktioniert hat – zu sehen.
Ich verwende zsh und bash unter Ubuntu. Gibt es dafür eine Einstellung oder ist das tief in POSIX oder so verwurzelt?
Antwort1
Das ist nicht das Problem von ls
. So funktionieren symbolische Links. Mit ..
gelangen Sie in das übergeordnete Verzeichnis des aktuellen Verzeichnisses, das Verzeichnis weiß nicht, dass Sie über einen symbolischen Link dorthin gelangt sind. Die Shell muss eingreifen, um dieses Verhalten zu verhindern. Für das in der Shell integrierte Element cd
gibt es eine spezielle Behandlung, die nicht nur aufruft chdir
, sondern sich den vollständigen Verzeichnispfad merkt und versucht, herauszufinden, was Sie möchten. ls
ist jedoch kein integriertes Element. Die Shell muss ..
zu einem anderen Pfad wechseln, bevor sie es an weitergibt, ls
wenn Sie das erwartete Ergebnis erhalten möchten. zsh
Die Option CHASE_DOTS
hilft Ihnen dabei.
Generell sind Symlinks zu Verzeichnissen eine schmutzige Angelegenheit. Für kritische und semi-permanente Anwendungen verwenden Sie lieber mount --bind
.
Antwort2
Da Sie Ihre Frage mit „“ markiert haben, zsh
gehe ich davon aus, dass wir über diese Shell sprechen.
Höchstwahrscheinlich haben Sie oh-my-zsh
die Variablen CHASE_LINKS
und/oder gesetzt (entweder direkt oder indirekt mit einem externen Skript wie ) CHASE_DOTS
. Um dies zu bestätigen, führen Sie aus setopt | grep -i chase
und prüfen Sie, ob sie aufgelistet sind. Wenn ja, setzen Sie sie einfach zurück:
unsetopt CHASE_DOTS
unsetopt CHASE_LINKS