Digamos que você tenha diretórios /dir1
e /dir2/linked
, onde o último é um link simbólico para o primeiro.
Quando você cd
para linked
e 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/linked
antes. 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 cd
honrar o caminho simbolizado, enquanto ls
honra o caminho "físico". Conforme mencionado nesta pergunta , existe cd -P
para 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
PWD
variável de ambiente, conforme mencionado emman pwd
? - Por que usar
cd
como padrão els
ter 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
PWD
vez do caminho físico? Sei que depende da implementação, mas existe alguma regra de ouro?
fonte
Respostas:
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:
Você precisa iniciar o bash com uma
PWD
variá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; portantols ..
, 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,
CWD
pois existem várias maneiras de iniciar programas. O shell bash é apenas um, portanto, não é confiável esperarCWD
conter o valor correto (tente definirCWD
algo errado antes de fazerbash -c pwd
, você pode verificá-lo o valor da sanidade).fonte
PWD
como assim, mas por si só isso não responder às perguntas que eu mencioneils
foi fornecida pelo bash, mas você ehelp
me convenceu do contrário. Isso torna as coisas muito mais claras, obrigado!PWD
é padrão no POSIX. Você pode confiar nele para ser definido. Se não estiver definido, as coisas podem quebrar, por exemplo, opwd
utilitário : Consulte também Variáveis de ambiente .