Pergunta

Estou um pouco confuso de como os links suaves funcionam no Unix. Veja o exemplo.

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

Isso não é problemático que, embora o Location_A seja Location_B, eles tenham caminhos diferentes?

Existe um comando (exceto o PWD) que fornecerá a localização real de um arquivo (não apenas como o usuário vai lá).

Parece -me que a PWD é apenas a soma do CD de um usuário. Não a localização atual deles.

Foi útil?

Solução

Isso se comporta assim com um propósito. Se você CD para /a/b/c/d E então CD para .. Então você espera realisticamente estar em /a/b/c. Se c passa a ser um link simbólico (ou symblink em termos unix - mas não link suave) que o leva a /f/g/h, com o comportamento que você gostaria de ter, acabaria em /f/g E então você (ou qualquer programa) não entenderia como chegou lá.

Outras dicas

Tentar pwd -P. Não é "além do PWD", mas faz o truque, pelo menos no meu Bash 4.0.35 no Fedora 12. YMMV.

Atualização: mesmo funciona com sh, então parece ser portátil.

Você pode usar o ReadLink no diretório de trabalho atual para obter o nome do diretório verdadeiro:

readlink `pwd`

Normalmente, pwd deve voltar /usr/local/java Na última linha, se eu entender seu exemplo. Mas algumas conchas têm um construir em pwd comando que tenta ser mais "inteligente" de manuseio síndicas no diretório de trabalho atual.

Tentar /bin/pwd, você obtém outros resultados?

Realpath faz o que você quer.

Não é possível colocar seu caminho absolutamente em todas as circunstâncias. Isso é um pouco estranho, mas uma variação disso (mais chroot e setuid) às vezes é usada para bloquear um processo.

$ 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top