Noções básicas sobre travessias de links simbólicos de diretório e o diretório pai

9

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

Quando você cdpara linkede pwd, você obter o resultado /dir2/linked. Se você então cd .., você será colocado /dir2. Esse comportamento é consistente com o conceito de você estar /dir2/linkedantes. No entanto, pelo que entendi, o diretório pai ( ..) de qualquer diretório é armazenado no inode do diretório (ou seja: fisicamente no disco). Obviamente, como /dir2/linkedé realmente /dir1, o diretório pai no inode deve ser/

Para complicar ainda mais, enquanto dentro /dir2/linked, as saídas ls ..e cd .. ; ls .são diferentes! Parece cdhonrar o caminho simbolizado, enquanto lshonra o caminho "físico". Conforme mencionado nesta pergunta , existe cd -Ppara este caso de uso.

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

  • Esse comportamento é sempre fornecido pela PWDvariável de ambiente, conforme mencionado em man pwd?
  • Por que usar cdcomo padrão e lster comportamentos diferentes, se ambos são comandos do shell (ou seja: não são programas)?
  • O programa típico (não o comando shell) usa em PWDvez do caminho físico? Sei que depende da implementação, mas existe alguma regra de ouro?
goncalopp
fonte
1
Muitas informações nesta resposta
Stéphane Chazelas 23/01
1
@ StéphaneChazelas Essa é uma resposta fantástica, obrigado por compartilhar
goncalopp
De nada. Sinta-se à vontade para copiar e colar o texto a partir daí, se você planeja fazer sua própria resposta à sua própria pergunta.
Stéphane Chazelas

Respostas:

5

bash "sabe" sobre links simbólicos e rastreia essas informações quando você usa um link simbólico para inserir 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 PWDvariável vazia , caso contrário, ele usa esse truque para exibir o caminho "falso".

Observe que este ls é um programa separado e, como tal, não possui o conhecimento do bash de como você chegou ao diretório atual; portanto ls .., apenas mostrará o conteúdo do diretório pai real , não relativo ao link simbólico que você seguiu.

A maioria dos programas não depende da variável de ambiente, CWDpois existem várias maneiras de iniciar programas. O shell bash é apenas um, portanto, não é confiável esperar CWDconter o valor correto (tente definir CWDalgo errado antes de fazer bash -c pwd, você pode verificá-lo o valor da sanidade).

Wurtel
fonte
é útil saber que você limpar PWDcomo assim, mas por si só isso não responder às perguntas que eu mencionei
goncalopp
Adicionado mais algumas informações.
wurtel
Eu estava com a impressão que lsfoi fornecida pelo bash, mas você e helpme convenceu do contrário. Isso torna as coisas muito mais claras, obrigado!
precisa saber é o seguinte
PWDé padrão no POSIX. Você pode confiar nele para ser definido. Se não estiver definido, as coisas podem quebrar, por exemplo, o pwd utilitário : Consulte também Variáveis ​​de ambiente .
3911 darkfeline