Eu tenho um script que procuro enquanto estou no bash. Ele faz várias coisas e retém o que $PWD
eu estava antes de obtê-lo.
pushd ~/.dotfiles >/dev/null || exit 1
# Do various things
popd >/dev/null || exit 1
O script roda (principalmente) bem em zsh também, mas quando eu o procuro do ~/.dotfiles
local, acabo no anterior $OLDPWD
depois de procurá-lo.
Parece que o zsh desconsidera a pushd
linha se o local atual já for o mesmo, então o popd
comando vai para o $OLDPWD
anterior quando o script foi originado.
Existe uma maneira de impedir que o zsh ignore o pushd
comando "redundante", ao mesmo tempo em que mantém o script compatível com o bash?
Eu tenho o seguinte no meu .zshrc
, mas também acontece quando eu os desconfiguro:
setopt AUTO_PUSHD PUSHD_SILENT PUSHD_IGNORE_DUPS
pushd
epopd
destinam-se à conveniência interativa. Eles não são confiáveis nem úteis em scripts.Você está vendo o efeito do
pushd_ignore_dups
, que está desativado por padrão, mas aparentemente você ativou em sua configuração.Outro problema potencial com
pushd
epopd
é que você precisa ter certeza de que está realmente pagando em pares. Há um alto risco de omitir acidentalmente umpopd
em um caminho de erro e isso gera confusão em todos os lugares.Em um script auxiliar destinado a ser originado, você geralmente não deve alterar o diretório atual. Basta usar caminhos absolutos em todos os lugares.
Se você realmente deseja alterar o diretório atual, use o
cd
comando. Salve o antigo diretório atual em uma variável.Isso funciona em todos os shells do estilo Bourne (mesmo aqueles que não implementam
pushd
epopd
) e nunca restaurará o diretório errado.No entanto, qualquer código baseado em sair de um diretório e voltar entrará em um caso incomum: se você não tiver permissão para voltar ao diretório original. Isso pode acontecer depois que um processo perde privilégios.
você precisa if-then-elsede uma resposta real.
Observe
||
) napushd
linhaEu tentei isso, que parece funcionar, mas gostaria de conhecer outras maneiras melhores, pois parece horrível:
Atualizar Não, isso não funciona na verdade, pois o terminal fecha quando está no
~/.dotfiles
diretório.