Stellen Sie die Funktionalität von 'cd ..' wieder her, nachdem Sie einem symbolischen Link gefolgt sind


13

Wenn ich mit einem Befehl wie im Terminal einen symbolischen Link erstelle

ln -s /path/to/some/directory symbolicLink

und folge dann dem Link mit

cd symbolicLink

Das Terminal scheint zu glauben, dass der CWD ~/symbolicLink/tatsächlich angezeigt wird ~/path/to/some/directory/(vorausgesetzt, die Verknüpfung wurde ~natürlich hergestellt). Das heißt, wenn ich dann eingebe, cd ..werde ich zurückgebracht ~, weil das Terminal "denkt", dass dies das übergeordnete Element des cwd ist.

Was müsste ich so ändern, dass cd ..ich stattdessen ~/path/to/some/zum wahren Elternteil von würde ~/path/to/some/directory/?

Antworten:



5

Das cd -PVerhalten weist eine subtile Einschränkung auf (aufgrund der Länge als Antwort veröffentlicht):

$ dir1=$(mktemp --directory)
$ dir2=$(mktemp --directory)
$ ln -s -- "$dir1" /tmp/start
$ ln -s -- "$dir2" "$dir1"
$ cd "/tmp/start/"*
$ cd -P ..

Was soll pwdjetzt gedruckt werden? Logischerweise könnte es auch so sein

  1. $dir1Wenn cd -P ..tut cd ..zuerst und cd -- "$(readlink -f)"danach, oder
  2. /tmpWenn cd -P ..tut cd -- "$(readlink -f)"zuerst und cd ..danach.

Tatsächlich tut es das letztere, was bedeutet, dass pwdes intuitiv zwei Ebenen höher ist als das "Eltern" -Verzeichnis.


1
Vielen Dank! cd -Plöst immer noch das Problem, mit dem ich konfrontiert war, ist aber dennoch nützlich zu wissen.
Val

2

Eine alternative Möglichkeit ist das Ausführen von:

cd $(/bin/pwd)/..

2

Ich fühle Ihren Schmerz - ich bin der Meinung bash, dass ich aufgrund dieses Verhaltens für die interaktive Verwendung grundsätzlich kaputt bin .

tcshist eine weitaus benutzerfreundlichere Shell für den interaktiven Gebrauch. Lassen Sie die bashProgrammierung (wenn Sie darauf bestehen, Shell-Skripte zu schreiben, wenn es unter den vielen Skriptsprachen viel bessere Alternativen gibt).

Um die Shells für einen Benutzer zu ändern, geben Sie chshin die Befehlszeile ein und befolgen Sie die Anweisungen (ich empfehle erneut /bin/tcshund das ausgezeichnete O'Reilly-Buch Using csh and tcsh , das für so gut wie nichts Verwendetes verfügbar ist).


Seit ich diese Antwort geschrieben habe, habe ich gelernt, mich nicht mehr zu sorgen und Bash für die interaktive Verwendung zu lieben. Aber ich kann mich immer noch nicht mit dem Standardverhalten cdfür Symlinks befassen . Ich muss daran denken, set -o physicalmein .bashrcoder .bash_profilefür jede Maschine, die ich benutze, einzutragen.
dodgethesteamroller
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.