Wie kann ich über die Befehlszeile feststellen, ob ich mich tatsächlich an einem Symlink-Standort befinde?

33

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 pwdwird 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

Oliver Williams
quelle
1
Einige Shells erlauben es Ihnen nicht, sich in einem Symlink zu befinden. Zum Beispiel fishlöst die Shell den Symlink automatisch auf, wenn Sie hineingehen cd.
Trysis

Antworten:

56

Je nachdem, wie Ihr pwdBefehl konfiguriert ist, wird möglicherweise standardmäßig das logische Arbeitsverzeichnis (Ausgabe von pwd -L) angezeigt, in dem der Symlink-Speicherort angezeigt wird , oder das physische Arbeitsverzeichnis (Ausgabe von pwd -P), in dem der Symlink ignoriert wird und das "echte" Verzeichnis angezeigt wird.

Für vollständige Informationen können Sie tun

file "$(pwd -L)"

Innerhalb eines Symlinks wird dies zurückgegeben

/path/of/symlink: symbolic link to /path/of/real/directory
Zanna
quelle
1
Ja, die -PFlagge war das, was ich brauchte. Vielen Dank
Oliver Williams
6
Um auch die Frage im Titel zu beantworten, verwenden Sie einfach test "$(pwd -L)" = "$(pwd -P)" && echo No symlinks(oder ersetzen Sie && echo No symlinksdurch || echo Symlinks).
ein Lebenslauf vom
1
Dies beantwortet die Frage perfekt, ohne dass ein Echo erforderlich ist. Wenn die Frage lautete: "Wie zeige ich eine Nachricht an, wenn ich mich in einem verknüpften Verzeichnis befinde?", Wäre ein Echo erforderlich.
Arronical,
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 verwenden realpath ., die meiner Meinung nachpwd -P
Peter Cordes,
17

Beachten Sie, dass pwdtatsä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:

NAME
       pwd - print name of current/working directory

SYNOPSIS
       pwd [OPTION]...

DESCRIPTION
       Print the full filename of the current working directory.

       -L, --logical
              use PWD from environment, even if it contains symlinks

       -P, --physical
              avoid all symlinks

       --help display this help and exit

       --version
              output version information and exit

       If no option is specified, -P is assumed.

       NOTE:  your  shell  may  have  its  own  version of pwd, which usually supersedes the version described here.  Please refer to your shell's documentation for
       details about the options it supports.

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 wie pwd -P.

Gowtham
quelle
2
Obwohl ich auf die harte readlink -fTour gelernt habe, die nicht für alle Unices verfügbar ist (z. B. nicht für OS-X)
abligh
3

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 aufgelisteten ls -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 pwdShell 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 einen cdBefehl ausführen, merkt sich Ihre Shell diesen als Teil des Pfads, um zu sehen, wo Sie sich gerade befinden, und pwddruckt aus, was er basierend auf allen von cdIhnen 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 . foound halten cding in foo - /bin/pwdwerden Sie noch im selben Verzeichnis, aber die Schale builtin sagen sind pwdwerden sagen , du bist in /foo/foo/foo/foo/foo/foo- auch wenn kein solches Verzeichnis auch wirklich existiert. (Das heißt - Sie wahrscheinlich kann cd hinein.)

Ein weiterer Grund für Verwirrung besteht darin, dass Verzeichnisse umbenannt werden. /bin/pwdDie Änderung wird dann sofort übernommen, die integrierte Funktion pwdjedoch erst, wenn Sie einen Befehl ausführen, der besagt, dass der alte Verzeichnisname keine Rolle spielt.

dougmc
quelle
1
Sie beantworten die Frage nicht, Sie lehnen sie ab.
Dmitry Grigoryev
4
Während dies die Frage nicht beantworten , direkt , ich denke , es für das Verständnis des Unterschiedes zwischen dem Shell ein nützlichen Beitrag ist pwdbuiltin und /bin/pwdund erklärt , wie die Standalone - Version bietet weitere nützliche Informationen (die die ursprüngliche Frage beantworten können).
Anthony G - Gerechtigkeit für Monica
1
Diese Unterschiede beschränken sich alle auf die -Pund -LOptionen, 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/pwdphysisch, aber beide akzeptieren beide Befehlszeilenoptionen und sind sich über das Ergebnis einig, wenn sie angegeben werden.
IMSoP
1
Die Frage basiert auf einer falschen Prämisse: "Gibt es eine Möglichkeit zu wissen, dass ich" wirklich "in / var / lib / class bin?" Das heißt ... indem er erklärt, was das wirklich bedeutet, hilft es ihm zu verstehen, wonach er wirklich sucht. Die Optionen pwd -P und -L wurden bereits erwähnt ...
dougmc
1
Sie haben Ihre Argumentation rückwärts. 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 keinen chdir("..")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- $PWDVariable zu aktualisieren ). Sie machen einen nützlichen Punkt, also würde ich diesen Punkt verbessern, wenn er behoben ist
Peter Cordes,
1

Im Wesentlichen werden Sie gefragt, ob der tatsächliche Pfad des aktuellen Arbeitsverzeichnisses angezeigt werden soll. Nun, es gibt mit Python und os.getcwd()Funktion

Was 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.

bash-4.3$ file "$(pwd)"
/home/xieerqi/VirtualBox VMs: symbolic link to /mnt/HDD/VirtualBox VMs/
bash-4.3$ python -c 'import os; print os.getcwd()'
/mnt/HDD/VirtualBox VMs

Wie Sie sehen, os.getcwd()löst Python den tatsächlichen Pfad des Verzeichnisses auf, nicht den Pfad von symlink.

Sergiy Kolodyazhnyy
quelle