Por que “ls ..” mostra o conteúdo do pai real quando estou dentro de um diretório de link simbólico?

2
$ cd ~
$ ln -s /real/folder symbolic_link

$ cd symbolic_link
$ cd ..
$ ls -l
symbolic_link -> /real/folder/

$ cd symbolic_link
$ ls -l ..
folder

Em outras palavras, por que o comportamento de cd .. é diferente de ls .. quando você está dentro de um diretório simbólico vinculado?

    
por daVe 08.06.2017 / 12:57

1 resposta

3

Seu shell rastreia os links simbólicos que o levaram ao seu diretório de trabalho atual. cd é um shell integrado e help cd states (exemplo de bash ):

Options:
-L force symbolic links to be followed: resolve symbolic links in DIR after processing instances of ..
-P use the physical directory structure without following symbolic links: resolve symbolic links in DIR before processing instances of ..
[…]
The default is to follow symbolic links, as if -L were specified.

Você pode tentar cd -P .. e ver a diferença. Outro exemplo é pwd -L e pwd -P (enquanto pwd também é um shell embutido).

Observe que o comportamento padrão pode ser alterado por set -P e set +P . Veja help set para mais detalhes.

Por outro lado, ls é um executável separado que não se beneficia dessa capacidade de rastreamento do seu shell. No entanto, você pode seguir links simbólicos com este truque:

(cd -L .. && ls -l)

Basicamente, usamos cd para alterar o diretório de trabalho atual em relação aos links simbólicos (e usei explicitamente a opção -L padrão para isso) e invoco ls -l . O operador && significa que ls será executado somente se cd for bem-sucedido. Parênteses () fazem com que tudo o que está dentro seja executado em uma subcamada. Este é o truque: o comando cd afeta apenas este subshell e no seu shell principal nada muda, não há necessidade de cd voltar.

    
por 08.06.2017 / 13:14

Tags