Noções básicas sobre percursos de symlinks de diretório e o diretório pai

8

Digamos que você tenha diretórios /dir1 e /dir2/linked , onde o último é um link simbólico para o primeiro.

Quando você cd to linked e pwd , obtém a saída /dir2/linked . Se você, em seguida, cd .. , você será colocado em /dir2 . Esse comportamento é consistente com o conceito de você estar em /dir2/linked antes. No entanto, pelo que entendi, o diretório pai ( .. ) de qualquer diretório é armazenado no diretório inode (por exemplo: fisicamente no disco). Obviamente, como /dir2/linked é realmente /dir1 , o diretório pai no inode deve ser /

Para complicar ainda mais as coisas, enquanto dentro de /dir2/linked , as saídas de ls .. e cd .. ; ls . são diferentes! Parece que cd respeita o caminho simbolizado, enquanto ls respeita o caminho "físico". Conforme mencionado em esta pergunta , há cd -P para esse caso de uso, embora .

man pwd menciona diretórios de trabalho "físicos" e "lógicos", mas ainda tenho algumas perguntas neste ponto:

  • Esse comportamento sempre é fornecido pela variável de ambiente PWD , conforme mencionado em man pwd ?
  • Por que o padrão cd e ls tem comportamentos diferentes, se ambos forem comandos de shell (por exemplo, não programas)?
  • O típico programa (não o comando shell) usa PWD em vez do caminho físico? Eu percebo que depende da implementação, mas existe alguma regra prática?
por goncalopp 23.01.2015 / 12:04

1 resposta

5

bash "sabe" sobre links simbólicos e rastreia esta informação quando você usa um symlink para entrar em um diretório.

Você pode verificar isso fazendo o seguinte no seu exemplo:

$ cd /dir2
$ cd linked
$ pwd
/dir2/linked
$ PWD='' bash -c pwd
/dir1

Você precisa iniciar o bash com uma variável PWD vazia, caso contrário, ele usará esse truque para exibir o caminho "falso".

Observe que ls é um programa separado e, como tal, não tem conhecimento de como você chegou ao diretório atual, portanto ls .. mostrará apenas o conteúdo do diretório real , não relativo ao symlink que você seguiu.

A maioria dos programas não depende da variável de ambiente CWD , pois há muitas maneiras de iniciar programas, através do bash shell é apenas um, então não é confiável esperar que CWD contenha o valor correto (tente definir CWD de algo errado antes de fazer bash -c pwd , você pode ver que ele verifica o valor da sanidade).

    
por 23.01.2015 / 12:14