Você tem o histórico que quiser:
cd() {
[ "$((${DIRSTACKMAX##*[!0-9]*}0/10))" -gt 0 ] &&
set -- "$@" "$DIRSTACK" &&
DIRSTACK='pwd -P >&3; command cd' ||
{ command cd "$@"; return; }
_q() while case "$1" in (*\'*) : ;; (*)
! DIRSTACK="$DIRSTACK '$2$1'" ;;esac
do set -- "${1#*\'}" "$2${1%%\'*}'\''"
done
while [ "$#" -gt 1 ]
do case ${1:---} in (-|[!-]*|-*[!0-9]*) : ;;
(*) eval " set $((${1#-}+1))"' "${'"$#}\""
eval ' set -- "$2"'" $2"'
set -- "${'"$1"'}" "$1"'
;;esac; _q "$1"; shift
done
eval " DIRSTACK=; $DIRSTACK &&"'
_q "$OLDPWD" &&
DIRSTACK=$DIRSTACK\ $1
set "$?" "${DIRSTACK:=$1}"'" $1
" 3>/dev/null
[ "$(($#-1))" -gt "$DIRSTACKMAX" ] &&
DIRSTACK="${DIRSTACK% \'/*}"
unset -f _q; return "$1"
}
Essa é uma função de shell que deve permitir que qualquer shell compatível com POSIX ofereça zsh
-style cd
history. Ele faz todo o seu trabalho sem invocar um único subshell, e eu acredito que seu fluxo é muito bom - parece lidar com todos os casos corretamente sob testes moderados.
A função tenta jogar tão bem com o ambiente quanto possível, embora ainda contando com sintaxe totalmente portátil - faz apenas uma suposição e é que a variável de ambiente $DIRSTACK
é sua propriedade para fazer com o que quiser.
Ele canoniza todos os caminhos que ele armazena em $DIRSTACK
e serializa todos eles em aspas simples - embora garanta que cada um seja seguramente citado e serializado antes de adicioná-lo ao valor da variável e não deve ter nenhum problema com quaisquer caracteres especiais de qualquer tipo. Se a variável de ambiente $DIRSTACKMAX
estiver configurada, ela será usada como um limite superior para o número de caminhos que ela retém no histórico, caso contrário, o limite é um.
Se você carregar a função você apenas cd
como normal, mas também poderá fazer o cd -[num]
para voltar atrás no histórico do diretório de alterações.
O mecanismo principal da função é cd
em si - e as variáveis de ambiente ${OLD,}PWD
. O POSIX especifica que cd
os altera para cada movimento do caminho - e, portanto, apenas usa as variáveis incorporadas do shell e salva os valores pelo tempo que desejar.