Talvez eu esteja perdendo, mas não encontro documentação que mostre que isso cd ''
deveria funcionar. Como não há um diretório com o nome ''
, parece óbvio que deveria falhar. Por exemplo,
mydir=
cd -- "$mydir" || exit 1 # succeeds!!
echo wrong
Parece um bug em cerca de um milhão de scripts, só esperando para acontecer. Será que isso é algum tipo de bug de compatibilidade com versões anteriores? Eu realmente preciso fazer uma verificação separada para um nome de variável vazio toda vez que eu cd
? Aliás, shellcheck
também não detecta isso.
A especificação POSIX mais recente para o
cd
utilitário (edição 8, de 2024) contém isto na seção OPERANDOS:Entretanto, no momento da redação deste texto (2025), esta é uma adição relativamente recente, e a edição anterior do padrão dizia que não era "especificado" o que um operando vazio faria o utilitário fazer, deixando a cargo dos implementadores do padrão fornecer um comportamento consistente útil.
Todos os shells que uso diariamente (
bash
,zsh
, OpenBSDksh
,ash
) tratamcd ''
comocd .
(ou o primeiro diretório acessível em$CDPATH
if definido), enquanto o shell (muito não POSIX)rc
(e derivados) efish
geram um erro paracd ''
.O
cd
decsh
etcsh
relata um erro, a menos que$cdpath
em conjunto, nesse caso, como nos shells mencionados acima para$CDPATH
, elechdir()
vai para o primeiro diretório acessível naquele array.Se esses shells aspiram ser compatíveis com POSIX (alguns são, outros não, mas tendem a alinhar o comportamento geral dos utilitários padrão integrados ao padrão comum), tenho certeza de que eles serão atualizados ao longo do tempo para se adequarem à nova especificação.
Na verdade, a versão de desenvolvimento mais recente
bash
faz isso:Enquanto isso, se isso for importante para o seu script, você deve testar o valor da variável de shell usada como operando para
cd
. Uma medida mínima a ser tomada seria usar algo comocd "${mydir:?Empty or unset variable}"
no seu script:... ou faça uma verificação de integridade separada na variável antes de seu uso.