Resolvendo links simbólicos (pwd)

23

Digamos que eu faça o seguinte:

cd /some/path
ln -s /target/path symbolic_name

Se então, faça:

cd /some/path
cd symbolic_name
pwd

Eu recebo:

/some/path/symblic_name

e não:

/target/path

Existe uma maneira de fazer com que o shell "resolva totalmente" um link simbólico (por exemplo, atualizando o CWD etc.), como se eu tivesse feito diretamente:

cd /target/path

?

Eu preciso executar alguns programas que parecem estar "cientes" ou "sensíveis" sobre como eu chego ao meu caminho de destino, e gostaria que eles achassem que cheguei ao caminho de destino como se tivesse feito cd /target/path diretamente.

    
por Amelio Vazquez-Reina 03.02.2013 / 22:58

2 respostas

26

Seu shell tem um pwd embutido, que tenta ser "inteligente". Depois que você fez um cd em um link simbólico, o pwd interno falsifica a saída como se você tivesse movido para um diretório real.

Passe a opção -P para pwd , ou seja, execute pwd -P . A opção -P (para “físico”) diz a pwd para não fazer nenhum rastreamento de link simbólico e exibir o caminho “real” para o diretório.

Como alternativa, também deve haver um binário real pwd , que não faz (e nem é capaz de fazer) esse tipo de mágica. Apenas use essa explicitamente binária:

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
$ mkdir a
$ ln -s a b
$ cd b
$ pwd
/home/michas/b
$ /bin/pwd
/home/michas/a
    
por 03.02.2013 / 23:18
9

Experimente cd -P <symlink_dirname> .

tim@ls:~$ mkdir a
tim@ls:~$ ln -s a b

tim@ls:~$ cd b
tim@ls:~/b$ pwd
/home/tim/b

tim@ls:~/b$ cd ..
tim@ls:~$ cd -P b
tim@ls:~/a$ pwd
/home/tim/a

Você também pode usar set -o physical para fazer esse comportamento persistir durante a vida útil do shell em execução.

Confira link para mais informações boas.

    
por 03.02.2013 / 23:17