Ich habe einen Symlink mit absolutem Pfad zum Verzeichnis (Blink) angelegt und habe zum Beispiel folgenden Baum:
$ ls -l /tmp/A
total 0
lrwxrwxrwx 1 root root 6 Apr 3 12:27 Blink -> /tmp/B
-rw-r--r-- 1 root root 0 Apr 3 12:27 foo
$ ls -l /tmp/B
total 0
-rw-r--r-- 1 root root 0 Apr 3 12:27 bar
dann gehe ich zu / tmp / A und wechsle in das Verzeichnis Blink:
$ cd /tmp/A
$ pwd
/tmp/A
$ cd Blink
$ pwd
/tmp/A/Blink
cd ..
Gibt mich zurück zu, /tmp/A
aber wenn ich zum Beispiel ls ../foo
tippe, bekomme ich eine Fehlermeldung:
ls: ../foo: No such file or directory
eingebauter cd befehl löst pfad nach bedarf auf, aber externe ls betrachten den .. als up-level von / tmp / B und können daher foo nicht finden.
Was ist das Problem hier? Kann ich die foo-Datei von / tmp / A / Blink über einen relativen Pfad wie ../foo abrufen?
Antworten:
Ich glaube nicht, dass du das schaffst. Heutzutage behalten Shells den Überblick darüber, wo sie sich gerade befinden. Sie verfolgen das aktuelle Arbeitsverzeichnis nach Namen und verlassen sich nicht nur auf das Dateisystem und das Betriebssystem, um es zu behalten. Das bedeutet, dass das eingebaute
cd
Element die symbolische Verknüpfung "sichern" kann, anstatt nur ".." Ketten direkt zu folgen.Aber wenn Sie ausführen
ls ../foo
,ls
ist nicht bekannt, dass die Shell durch Verfolgen von symbolischen Links zu einem Verzeichnis gelangt ist.ls
werde einstat()
auf "../foo" machen. Der Teil ".." stammt aus dem aktuellen Verzeichnis, das nur einen einzigen Eintrag ".." für das übergeordnete Verzeichnis enthält. Die ganze symbolische Verknüpfungssache ändert nichts an der Art und Weise, wie Verzeichnisse ein einzelnes "." und ein einzelner ".." Eintrag. Durch symbolische Links fügt der Kernel eine zusätzliche Indirektionsebene in die Dateipfade ein. Wenn Sie "../whatever" anopen()
oder übergebenstat()
, verwendet der Kernel nur das aktuelle Arbeitsverzeichnis des Prozesses, der den Aufruf ausführt, um herauszufinden, welches einzelne Verzeichnis mit ".." benannt ist.quelle
Die Shell speichert das aktuelle Arbeitsverzeichnis in
$PWD
. Das ist, was für die Shell-Builtinscd
und verwendet wirdpwd
, und es behandelt Symlinks wie normale Verzeichnisse, wie Sie gesehen haben. Manchmal ist das hilfreich, manchmal nicht.Sie finden das reale Verzeichnis mit
pwd
(geben Siehelp pwd
für weitere Details ein):Ebenso
cd
hat eine Option-P
(wiederhelp cd
ist dein Freund):Schließlich können Sie die "Funktion" insgesamt deaktivieren:
quelle
set -P
Verhalten von use und ls langsam Sinn. :)Bruce und ams gaben wunderschöne Antworten und erklärten das Verhalten dahinter. Aber um das zu tun
ls ../foo
, wonach Sie gefragt haben, könnten Sie sich für so etwas entscheidenquelle
Du kannst es nicht machen, weil
/tmp/A/Blink
es tatsächlich so ist/tmp/B
. Funktioniert alsols ../A/foo
.Sie können stattdessen finden es sinnvoll, in der Lage sein cd in die reale
/tmp/B
Verzeichnis, anstatt die aliased/tmp/A/Blink
. Um dies zu tun, können Sie stattdessen die folgende Funktion verwendencd
(die Sie in Ihre .bashrc einfügen können)lcd
Funktioniert natürlich auch für normale und symbolisch verknüpfte Verzeichnisse.Hinweis:
readlink -f
Wirkt auf das endgültige Ziel der Verknüpfung (wenn Verknüpfungen hintereinander geschaltet sind).quelle
cd -P
scheint einfacher.