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/?

Val
quelle

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.

l0b0
quelle
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)/..
jlliagre
quelle
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).

dodgethesteamroller
quelle
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