Unix программные ссылки и пути - PullRequest
2 голосов
/ 21 января 2010

Я немного запутался, как работают софт-ссылки в Unix. Смотрите пример.

% 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**

Разве это не проблема, что, хотя LOCATION_A и есть LOCATION_B, у них разные пути?

Есть ли команда (кроме pwd), которая будет указывать реальное местоположение файла (а не только то, как пользователь туда попадает).

Мне кажется, что pwd - это просто сумма компакт-диска пользователя. НЕ их текущее местоположение.

Ответы [ 6 ]

4 голосов
/ 21 января 2010

Попробуйте pwd -P. Это не «кроме pwd», но оно помогает, по крайней мере, на моем bash 4.0.35 на Fedora 12. YMMV.

Обновление: работает даже с sh, так что оно кажется переносимым.

3 голосов
/ 21 января 2010

Это ведет себя так с целью. Если вы перейдете на /a/b/c/d, а затем на .., то вы реально ожидаете, что будете в /a/b/c. Если c окажется символической ссылкой (или символической ссылкой в ​​терминах Unix - но не мягкой ссылкой), которая приведет вас к /f/g/h, то поведение, которое вы хотели бы иметь, приведет к /f/g, а затем вы ( или любая программа) не поймет, как она туда попала.

1 голос
/ 21 января 2010

Обычно, pwd должен возвращать /usr/local/java в последней строке, если я понимаю ваш пример. Но в некоторых оболочках есть команда build pwd, которая пытается «умнее» обрабатывать символические ссылки в текущем рабочем каталоге.

Попробуйте /bin/pwd, вы получаете другие результаты?

1 голос
/ 21 января 2010

Вы можете использовать ссылку для чтения в текущем рабочем каталоге, чтобы получить истинное имя каталога:

readlink `pwd`
0 голосов
/ 21 января 2010

Невозможно абсолютно точно найти свой путь при любых обстоятельствах. Это немного странно, но вариация этого (плюс chroot и setuid) иногда используется для блокировки процесса.

$ 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
0 голосов
/ 21 января 2010

realpath делает то, что вы хотите.

...