Os comandos cd
e pwd
têm dois modos operacionais.
-
-L modo lógico: links simbólicos não são resolvidos
-
-P modo físico: os links simbólicos são resolvidos antes de executar a operação
O importante é saber que cd ..
não chama o syscall chdir("..")
, mas encurta a variável $PWD
do shell e, em seguida, passa para o caminho absoluto.
Se você estiver no modo físico, isso é idêntico a chamar chdir("..")
, mas quando no modo lógico, isso é diferente.
O principal problema aqui: POSIX decidiu usar o modo lógico menos seguro como padrão.
Se você chamar cd -P
em vez de apenas cd
, depois de uma operação chdir()
, o valor de retorno de getcwd()
será colocado na variável $PWD
e um cd ..
a seguir o levará a o diretório que está fisicamente acima do diretório atual.
Então, por que o padrão POSIX é menos seguro?
Se você cruzou um symlink no modo padrão POSIX e faça o seguinte:
ls ../*.c
cd ..
rm *.c
você provavelmente removerá arquivos diferentes daqueles que foram listados pelo comando ls
antes.
Se você gosta do modo físico mais seguro, configure os seguintes alias:
alias cd='cd -P'
alias pwd='pwd -P'
Visto que ao usar mais de uma opção de -L
e -P
a última opção vence, você ainda poderá obter o outro comportamento.
Histórico:
O Bourne Shell e o ksh88 obtiveram o código de acompanhamento de diretórios ao mesmo tempo.
O Bourne Shell obteve o comportamento físico mais seguro, enquanto o ksh88, ao mesmo tempo, obteve o modo lógico menos seguro como padrão e as opções -L
e -P
. Pode ser que o ksh88 tenha usado o comportamento do csh como referência.
O POSIX assumiu o comportamento do ksh88 sem discutir se esta é uma boa decisão.
BTW: alguns shells não conseguem rastrear os valores $PWD
que são maiores que PATH_MAX
e deixam você louco quando você entra em um diretório com um caminho absoluto maior que PATH_MAX
. dash
é uma casca com defeito.