Os shells rastreiam os links simbólicos como uma conveniência para os usuários. Isso tem o bom efeito de que cd foo && cd ..
sempre retorna ao diretório original, mesmo quando foo
é um link simbólico para um diretório. Tem dois tipos de desvantagens: a principal é que outros programas não se comportam dessa maneira; Além disso, o acompanhamento de diretórios simbólicos apresenta problemas próprios (o que acontece quando o link simbólico é alterado? o que acontece se o processo não tiver permissão para ler o link simbólico? etc.).
Os shells só podem fazer isso porque eles rastreiam todas as alterações no diretório, então eles se lembram de como você chegou lá. Quando um novo processo é iniciado, ele não recebe essa informação histórica. Sob o capô, ele descobre onde está, movendo-se para cima a partir do diretório atual, seguindo os links ..
até atingir a raiz¹.
Se você chegou a um diretório através de links simbólicos, pode imprimir um caminho sem link simbólico com o pwd
builtin, chamando pwd -P
. Se você chamar outro programa do shell, não passe um caminho que contenha ..
após os componentes do symlink, pois o programa o interpretaria de forma diferente. Em vez disso, elimine os componentes ..
chamando pwd -P
:
cp "$(cd .. && pwd -P && echo /)test-parent.txt" .
Se você quiser esquecer os links simbólicos usados nos comandos anteriores cd
em uma sessão de shell, você pode executar
cd "$(pwd -P && echo /.)"
Isso muda para o que já é o diretório atual, portanto, não altera efetivamente o diretório atual do processo do shell, mas altera o caminho que o shell rastreou para o diretório atual, tornando-o sem link simbólico.
¹ É assim que a chamada getcwd
opera tradicionalmente. Alguns kernels acompanham o diretório atual, mas não rastreiam links simbólicos, para compatibilidade com versões anteriores se não por outro motivo (mas também por causa dos casos sutis de bordas com links simbólicos).