Meus links simbólicos do Linux estão funcionando corretamente?

2

Eu tenho usado o Linux de vez em quando nos últimos 15 anos e hoje me deparei com algo no bash que me surpreendeu.

Configure a seguinte estrutura de diretórios:

$ cd /tmp
$ mkdir /tmp/symlinktest
$ mkdir /tmp/symlinktest/dir
$ mkdir /tmp/symlinktarget

Agora crie dois links sym em symlinktest apontando para symlinktarget:

$ cd /tmp/symlinktest
$ ln -s ../symlinktarget Asym
$ ln -s ../symlinktarget Bsym

Agora, no bash, a conclusão da tabulação a seguir faz coisas estranhas. Digite o seguinte:

$ cd dir
$ cd ../A[TAB]

Pressionar a tecla tab acima conclui a linha para:

$ cd ../Asym/

como eu esperava. Agora pressione enter para mudar para Asym e digite:

$ cd ../B[TAB]

Desta vez, pressionar a tecla tab completa o link para:

$ cd ../Bsym[space]

Observe que agora existe um espaço após o Bsym e não há barra final.

A minha pergunta é: por que ao mudar do diretório físico "dir" para Asym ele reconhece que o Asym é um link para um diretório, mas ao mudar de um link sym para outro, ele não reconhece que é um link para um diretório?

Além disso, se eu tentar criar um novo arquivo dentro do Asym, recebo uma mensagem de erro:

$ cd /tmp/symlinktest/Asym
$ cat hello > ../Bsym/file.txt
-bash: ../Bsym/file.txt: No such file or directory

Sempre achei que os links simbólicos eram mais transparentes, exceto para programas que precisavam manipulá-los. Isso é um comportamento normal?

Muito obrigado,

Andy

    
por Andy Castles 11.06.2010 / 14:57

1 resposta

2

O cd builtin do bash faz um pouco de mágica com .. .

Quando você faz:

cd ../Bsym

Ele olha para $PWD , remove o último componente e adiciona o componente Bsym. Isso é o que cd e cd -L fazem, em oposição a cd -P . Veja também pwd -L e pwd -P .

Quando você faz:

cat hello > ../Bsym/file.txt

Esta magia não acontece. $PWD não é usado, /proc/self/cwd é usado no lugar. O cwd é um inode, e .. é apenas o inode pai, que por acaso é /tmp .

    
por 11.06.2010 / 16:27