A razão pela qual isso não funciona automaticamente ATOW é um bug bash conhecido que evita a exportação de variáveis de array (veja seção bugs na página man). Infelizmente DIRSTACK é uma variável de array.
Eu criei substituições para pushd / popd / dirs que as envolvem, mas armazenam suas coisas em uma variável escalar, para que os processos filhos estejam cientes disso.
Se você obter o código abaixo e usar mypushd / mypopd / mydirs em vez dos originais, os processos filhos se lembrarão da pilha de seus pais. Observe que isso não funcionará com diretórios cujo nome inclua dois pontos!
Por favor me avise se você encontrar algum bug, porque eu acabei de escrever isso. Além disso, se você souber de uma alternativa mais simples, por favor, compartilhe!
export SCALARDIRSTACK
export DIRSTACK
update_dirstack()
{
if [ ! -z "$SCALARDIRSTACK" ]; then
dirs -c
# get an array from scalardirstack
IFS=':' read -a tmp <<< "$SCALARDIRSTACK"
# traverse in reverse order to pushd stuff into the stack
for (( idx=${#tmp[@]}-1 ; idx>=0 ; idx-- )) ; do
# gotta use pushd/popd this to manipulate DIRSTACK
pushd -n ${tmp[idx]} > /dev/null
done
fi
}
update_scalardirstack()
{
if [ ${#DIRSTACK[@]} -gt 1 ]; then
SCALARDIRSTACK=$(printf '%q:' ${DIRSTACK[@]:1}) # string from array
else
SCALARDIRSTACK=""
fi
}
scalar_dstack_wrap()
{
update_dirstack
$@
update_scalardirstack
}
alias mydirs='scalar_dstack_wrap dirs'
alias mypushd='scalar_dstack_wrap pushd'
alias mypopd='scalar_dstack_wrap popd'