Frage

Ich bin etwas verwirrt, wie Soft-Links in Unix arbeiten. Siehe Beispiel.

% cd /usr/local/
% ls -la
total 6
drwxr-xr-x   2 root     root         512 Jan 19 15:03 .
drwxr-xr-x  41 root     sys         1024 Jan 20 16:24 ..
lrwxrwxrwx   1 root     root          38 Jan 19 15:03 java -> /otherDir/java/jdk1.6.0_17 **<- this is a soft link**

% cd java **<- move to the softlink**

% pwd
/usr/local/java **<- the current location, say LOCATION_A**

% cd /otherDir/java/jdk1.6.0_17/ **<-move to the location of the softlink**

% pwd
/otherDir/java/jdk1.6.0_17 **<- the new current location, say LOCATION_B**

Ist das nicht problematisch, dass, obwohl LOCATION_A LOCATION_B ist, sie unterschiedliche Wege haben?

Gibt es einen Befehl (außer PWD), die der reale Speicherort einer Datei geben wird (und nicht nur, wie der Benutzer dorthin gehen).

Es scheint mir, wie pwd nur die Summe eines Benutzers cd ist. NICHT ihr aktueller Standort.

War es hilfreich?

Lösung

Dieses verhält sich wie diese zu einem bestimmten Zweck. Wenn Sie cd /a/b/c/d und dann cd zu .. dann erwarten Sie realistisch in /a/b/c zu sein. Wenn c passiert einen symbolischen Link (in Unix-Bedingungen oder Symlink - aber nicht Soft-Link) sein, die Sie /f/g/h nimmt, mit dem Verhalten würden Sie gerne haben würden Sie bis in /f/g beenden und dann würden Sie (oder ein Programm) nicht verstehen, wie es dort ankam.

Andere Tipps

Versuchen pwd -P. Es ist nicht „anders als pwd“, aber es funktioniert der Trick, zumindest auf meinem Bash 4.0.35 auf Fedora 12. YMMV.

Update: Auch Arbeiten mit sh, so dass es tragbar zu sein scheint,

.

Sie können auf dem aktuellen Arbeitsverzeichnis verwenden Readlink, um den wahren Verzeichnisnamen zu bekommen:

readlink `pwd`

Normalerweise pwd sollte /usr/local/java in der letzten Zeile zurückkehren, wenn ich Ihr Beispiel zu verstehen. Aber einige Schalen haben ein Build-in pwd Befehl, versucht mehr "intelligent" zu sein Symlinks im aktuellen Arbeitsverzeichnis der Handhabung.

Versuchen /bin/pwd, haben Sie andere Ergebnisse erhalten?

realpath tut, was Sie möchten.

Es ist nicht möglich, unbedingt Ihren Weg unter allen Umständen zu erhalten. Dies ist ein wenig seltsam, aber eine Variation dieses (plus chroot- und setuid-) wird manchmal zum Sperren eines Prozesses verwendet wird.

$ mkdir -p /tmp/a/b
$ cd /tmp/a/b
$ rmdir /tmp/a/b
$ chmod 0 /tmp/a
$ rmdir /tmp/a
$ ls ..
ls: cannot open directory ..: Permission denied
$ ls -al
total 0
$ pwd -P
pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top