Angenommen, ich habe einen Ordner:
cd /home/cpm135/public_html
und einen symbolischen Link erstellen
ln -s /var/lib/class .
Später bin ich in diesem Verzeichnis:
cd /home/cpm135/public_html/class
Das pwd
wird mir sagen, dass ich dabei bin/home/cpm135/public_html/class
Gibt es eine Möglichkeit zu wissen, dass ich "wirklich" bin /var/lib/class
? Vielen Dank
shell
symlink
cd-command
working-directory
Oliver Williams
quelle
quelle
fish
löst die Shell den Symlink automatisch auf, wenn Sie hineingehencd
.Antworten:
Je nachdem, wie Ihr
pwd
Befehl konfiguriert ist, wird möglicherweise standardmäßig das logische Arbeitsverzeichnis (Ausgabe vonpwd -L
) angezeigt, in dem der Symlink-Speicherort angezeigt wird , oder das physische Arbeitsverzeichnis (Ausgabe vonpwd -P
), in dem der Symlink ignoriert wird und das "echte" Verzeichnis angezeigt wird.Für vollständige Informationen können Sie tun
Innerhalb eines Symlinks wird dies zurückgegeben
quelle
-P
Flagge war das, was ich brauchte. Vielen Danktest "$(pwd -L)" = "$(pwd -P)" && echo No symlinks
(oder ersetzen Sie&& echo No symlinks
durch|| echo Symlinks
).file "$(pwd)"
Funktioniert nur, wenn der Symlink die letzte Verzeichniskomponente ist. Es erkennt den Symlink des OP nicht, wenn es an CD gesendet wird/home/cpm135/public_html/class/foo/bar
. Mir ist nichts bekannt, das Informationen für alle Symlinks in einem Pfadnamen ausgibt, aber Sie können auch Informationen verwendenrealpath .
, die meiner Meinung nachpwd -P
Beachten Sie, dass
pwd
tatsächlich eine Shell eingebaut ist. Abhängig von Ihrer Shell und ihrer Konfiguration können sich die Ergebnisse ändern. Für eine tragbarere Lösung sollten Sie verwenden/bin/pwd
. Ausschnitt aus der Manpage:Im Allgemeinen können Sie den vollständigen kanonischen Pfad einer beliebigen Datei / eines Verzeichnisses mithilfe von auflösen
readlink -f
.readlink -f .
funktioniert ähnlich wiepwd -P
.quelle
readlink -f
Tour gelernt habe, die nicht für alle Unices verfügbar ist (z. B. nicht für OS-X)Sie sind wirklich dabei
/home/cpm135/public_html/class
- das ist die einzig richtige Antwort auf die Frage "Was ist mein aktuelles Arbeitsverzeichnis?".Wenn Sie sich auf
/var/lib/class
... beziehen , geht es nicht wirklich darum, wo Sie sich befinden, sondern vielmehr darum, auf welchem Weg Sie dorthin gekommen sind .Wenn Sie ausführen
/bin/pwd
, wird Ihr aktuelles Arbeitsverzeichnis anhand der. und .. Verzeichnisse (die oben aufgelistetenls -la
), um herauszufinden, welches Verzeichnis in .. mit übereinstimmt. und dann rückwärts arbeiten bis .. und. Verweisen Sie auf dasselbe Verzeichnis. Sobald das erledigt ist, weiß es, was Ihr aktuelles Arbeitsverzeichnis ist.Wenn Sie die integrierte
pwd
Shell ausführen, befolgt sie diese Prozedur nicht (obwohl sie möglicherweise bei Bedarf einen Teil davon ausführt) - stattdessen merkt sie sich den Pfad, den Sie genommen haben, um hierher zu gelangen. Jedes Mal, wenn Sie einencd
Befehl ausführen, merkt sich Ihre Shell diesen als Teil des Pfads, um zu sehen, wo Sie sich gerade befinden, undpwd
druckt aus, was er basierend auf allen voncd
Ihnen ausgeführten Befehlen berechnet hat - was möglicherweise Ihr tatsächlicher ist oder nicht Arbeitsverzeichnis.Die Dinge können sich wirklich seltsam, wenn Sie ein tun
ln -s . foo
und haltencd
ing in foo -/bin/pwd
werden Sie noch im selben Verzeichnis, aber die Schale builtin sagen sindpwd
werden sagen , du bist in/foo/foo/foo/foo/foo/foo
- auch wenn kein solches Verzeichnis auch wirklich existiert. (Das heißt - Sie wahrscheinlich kanncd
hinein.)Ein weiterer Grund für Verwirrung besteht darin, dass Verzeichnisse umbenannt werden.
/bin/pwd
Die Änderung wird dann sofort übernommen, die integrierte Funktionpwd
jedoch erst, wenn Sie einen Befehl ausführen, der besagt, dass der alte Verzeichnisname keine Rolle spielt.quelle
pwd
builtin und/bin/pwd
und erklärt , wie die Standalone - Version bietet weitere nützliche Informationen (die die ursprüngliche Frage beantworten können).-P
und-L
Optionen, die in anderen Antworten genannt werden. Kurz gesagt, einige Implementierungen verwenden standardmäßig die eine oder die andere. Auf dem Centos-System, das ich zur Hand haben muss, ist die Standardeinstellung von bash logisch und/bin/pwd
physisch, aber beide akzeptieren beide Befehlszeilenoptionen und sind sich über das Ergebnis einig, wenn sie angegeben werden.ls ..
zeigt den Inhalt von/var/lib
, nicht/home/cpm135/public_html
.cd ..
ist etwas Besonderes: Die Shell zeichnet auf, wie Sie dorthin gekommen sind, und führt keinenchdir("..")
Systemaufruf durch. Für den Kernel ist das aktuelle Arbeitsverzeichnis (/proc/self/cwd
) Ihrer Shell nur ein Paar aus Mountpoint und Inode. Es ist wie ein offener Dateideskriptor im Verzeichnis, weshalb das Umbenennen des Verzeichnisses Ihre Shell nicht beschädigt. (cd .
um die Shell-$PWD
Variable zu aktualisieren ). Sie machen einen nützlichen Punkt, also würde ich diesen Punkt verbessern, wenn er behoben istIm Wesentlichen werden Sie gefragt, ob der tatsächliche Pfad des aktuellen Arbeitsverzeichnisses angezeigt werden soll. Nun, es gibt mit Python und
os.getcwd()
FunktionWas Sie unten sehen, ist ein kleiner Test aus dem "VirtualBox VMs" -Verzeichnis in meinem Home-Verzeichnis. In Wirklichkeit ist es ein Symlink zu einem anderen Verzeichnis, das sich auf einer anderen Festplatte befindet und unter bereitgestellt wird
/mnt/HDD
.Wie Sie sehen,
os.getcwd()
löst Python den tatsächlichen Pfad des Verzeichnisses auf, nicht den Pfad von symlink.quelle