Como faço o cd para cima e para baixo novamente com symlinks no bash?

5

Estrutura:

/base/
   +- somedir/
   +- symlink/  -> /some_other_dir

Este comando (além dos meus Makefiles) falha:

cd /base/symlink
ls ../somedir

Bash reclama que ../somedir não existe. Da mesma forma, meus makefiles em some_dir essa referência ../somedir falhar. No entanto, cd .. funciona exatamente como esperado. Posso ter meu shell agir com relação à estrutura lógica?

    
por Atilla Filiz 16.01.2013 / 15:53

1 resposta

8

.. é uma entrada de diretório no diretório atual. É um hardlink para o diretório um nível acima. /base/symlink/.. é na verdade o mesmo arquivo que /some_other_dir/.. , e é / (a menos que some_other_dir seja também um link simbólico para algum outro lugar).

Na maioria dos shells, cd trata .. especialmente, em vez de tratá-la como a entrada de diretório .. , ocorrências de .. são interpretadas por cd (e não pela resolução do nome do caminho do sistema) como remover um nível de diretório.

Como exemplo, em cd a/b/.. , o shell faz um chdir("a") em vez de fazer um chdir("a/b/..") . Para obter o último, você precisa fazer cd -P a/b/.. .

É importante perceber que isso se aplica apenas a cd (e somente em alguns shells), (IMO, uma má qualidade), não a ls ou vi ou qualquer outra coisa ( a menos que qualquer outra coisa seja um script escrito com esses shells).

Nos shells em que cd faz a interpretação lógica de .. , a variável pwd e a variável $PWD contêm o diretório atual lógico do real (físico), que é um com possivelmente componentes de diretório symlink. Da mesma forma, você pode usar pwd -P para obter o diretório de trabalho físico .

Agora, se você quiser fazer

cd /A/b
anything-but-cd ../c

E realmente significa:

anything-but-cd /A/c

Independentemente de o /A/b ser um link simbólico ou não, você pode fazer isso:

anything-but-cd "$(dirname -- "$PWD")/c"

ou

anything-but-cd "${PWD%/*}/c"
    
por 16.01.2013 / 17:05