Resolvendo links simbólicos (pwd)

32

Digamos que eu faça o seguinte:

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

Se sim, faça:

cd /some/path
cd symbolic_name
pwd

Eu recebo:

/some/path/symblic_name

e não:

/target/path

Existe uma maneira de o shell "resolver completamente" um link simbólico (ou seja, atualizar o CWD etc.), como se eu tivesse feito diretamente:

cd /target/path

?

Preciso executar alguns programas que parecem "cientes" ou "sensíveis" sobre como chego ao meu caminho de destino e gostaria que eles pensassem que cheguei ao caminho de destino como se tivesse feito cd /target/pathdiretamente.

Amelio Vazquez-Reina
fonte
7
Relacionado a esta pergunta . Você pode fazer pwd -Pou alias pwd='pwd -P'também cd -Pir para o caminho físico em vez do link simbólico.
Martín Canaval
@ MartínCanaval Obrigado; era isso que eu estava procurando!
Ryan

Respostas:

35

Seu shell possui um built-in pwd, que tenta ser "inteligente". Depois que você fez um cdlink simbólico, o interno pwdfalsifica a saída como se você fosse para um diretório real.

Passe a -Popção para pwd, ou seja, execute pwd -P. A -Popção (para "físico") indica pwdpara 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. Basta usar essa explicidade 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
michas
fonte
12

Tente 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 physicalpara fazer esse comportamento persistir durante a vida útil do shell em execução.

Confira https://stackoverflow.com/questions/10456784/behavior-of-cd-bash-on-symbolic-links para mais algumas boas informações.

livingstaccato
fonte