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.