Quando eu cd através de um symlink, por que o pwd mostra o symlink em vez do caminho real?

17

Eu criei um link ( ln -s 1 2 ) para um diretório que está dentro do diretório test e abri o link ( cd 2 ) e exibi o caminho atual usando pwd . O caminho exibido foi ~/test/2 e não ~/test/1 .

É diferente em um sistema operacional como o Windows, o atalho nos leva ao diretório real. Estou um pouco confuso como esse link soft funciona no Linux. Não é um atalho como em Windows ? Por que o caminho não é ~/test/1 ?

 $ mkdir test
 $ cd test
 $ mkdir 1
 $ ln -s 1 2
 $ cd 2
 $ pwd
 /home/dazz/test/2
    
por DScript 16.04.2015 / 19:03

3 respostas

15

Essa é uma característica do shell que lembra como você chegou onde você está.
Se você tem realpath instalado, você pode fazer:

$ realpath 
/home/dazz/test/1

E faltando isso se você tiver python:

$ python -c "import os; print(os.path.realpath('.'))"
/home/dazz/test/1

ou readlink (do coreutils):

$ readlink -f .
/home/dazz/test/1

ou /bin/pwd (não o pwd embutido no shell):

$ /bin/pwd
/home/dazz/test/1
    
por 16.04.2015 / 19:21
7

Contraste pwd e /bin/pwd .

pwd , que é um comando interno em muitos shells, informa onde o seu shell pensa que você está (e, portanto, trata os links simbólicos como se fossem diretórios reais.

/bin/pwd é um programa externo que informa onde você realmente está, se necessário, percorrendo a árvore do sistema de arquivos até / . Não leva em conta os links simbólicos, porque eles não existem quando são percorridos por ..

    
por 16.04.2015 / 19:28
6

Outras respostas cobriram /bin/pwd vs builtin pwd do shell.

Se você quiser seguir links simbólicos no estilo do Windows que você mencionou, use cd -P : ele irá alterar a variável PWD de acordo.

Se você quiser usar -P por padrão, poderá adicionar esta linha ao seu .bashrc ou .zshrc :

set -P

Outras camadas podem variar.

    
por 17.04.2015 / 07:57