Premissa
Eu li o que está listado na bibliografia sobre cd
, pwd
, set -P
.
Por padrão, ou quando a
-L
opção é fornecida, os links simbólicos no diretório são resolvidos apóscd
processar uma instância de '..
' no diretório. (ref. Manual de referência do Bash - seção " 4 comandos integrados do Shell" -cd
parágrafo )
Se '
..
' aparecer em directory , ele será processado removendo o componente do nome do caminho imediatamente anterior, de volta a uma barra ou ao início de directory . (ibid.)
Minha versão do Bash é
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Problema
Para testar as coisas, tenho o seguinte esquema de arquivos em meu diretório de trabalho atual que é a raiz do meu experimento ( dir111
é um link simbólico para dir010
).
dir010/
dir020/
dir110/dir111 -> ../dir010
my_dir="$PWD"
cd dir110/dir111 # 1
cd .. # 2
cd dir111 # 3
cd ../dir020 # 4
cd "$my_dir" # 5
cd dir110/dir111/../dir020 # 6
cd - # 7
cd dir110/dir111/../../dir020 # 8
- define o diretório de trabalho atual como
"$my_dir"/dir110/dir111
, conforme esperado[^1]. - define o diretório de trabalho atual como
"$my_dir"/dir110
, conforme esperado[^1]. - de volta para 1.
- define o diretório de trabalho atual
"$my_dir"/dir020
como inesperado . Eu esperariacd
falhar em"$my_dir"/dir110/dir020
(veja a explicação abaixo). - de volta à raiz do meu experimento.
- o mesmo que 4 .
- de volta à raiz do meu experimento.
- define o diretório de trabalho atual como
"$my_dir"/dir020
, conforme esperado[^1], mas em contraste com 6.
A linha 4 deve falhar pelo motivo do parágrafo seguinte.
O manual de referência e a página de manual (veja a citação na Premissa) dizem que ..
make cd
apenas remove o componente do nome do caminho anterior, em vez de olhar para a ..
entrada do inode. Portanto, o diretório pai "$my_dir/dir110/dir111
visto por cd
(no comportamento padrão) é "$my_dir/dir110
, que não contém dir020
.
Achei que esse comportamento poderia ser uma exceção causada por ..
ser o prefixo do «dirname»
fornecido to cd «dirname»
. No entanto, usar ..
como infixo (linha 6) contrasta com isso.
cd
está se comportando como se cd -P
tivesse sido executado (ou set -P
comando (ou similar) emitido antes), ou seja, não seguindo links simbólicos. Com cd -P
, em 1., o diretório de trabalho atual seria definido como $my_dir/dir010
.
set -o
diga-me
[omissis]
physical off
pipefail off
posix off
[omissis]
A minha interpretação (e de outras pessoas como eu em outras perguntas postadas) do manual de referência está correta? o que estou perdendo? Como o comportamento de pode cd
ser descrito?
[^1]: O comportamento padrão cd
é seguir links simbólicos
Bibliografia
- Página de manual do Bash, segundo. "COMANDOS CONSTRUÍDOS DA SHELL"
- Manual de referência do Bash, seção. "4 comandos internos do Shell"
- Alterando o diretório pai (../) com links simbólicos
- Resolução do caminho dependendo do pwd (diretórios com links simbólicos)
- Como faço para subir e descer novamente com links simbólicos no bash?
O código-fonte observa que este é um caso especial, onde o bash tenta novamente
cd
se o diretório lógico não funcionar:Para testar isso, criei outro diretório no
dir110
chamadodir120
e corristrace
para ver aschdir(2)
chamadas:Você pode ver a diferença na forma do caminho fornecido
chdir()
.E claro, como diz o comentário, o comportamento é diferente no modo POSIX: