bash - herda a pilha de diretórios em crianças

2

Se, no meu bash recém-criado, eu fizer:

pushd foo
pushd bar
dirs -l -v

Eu vou conseguir algo como

0  bar
1  foo
2  old_dir

Se eu fizer então

bash
dirs -l -v

Eu só obtenho

0  bar

O mesmo acontece se eu usar screen em vez de bash .

Como eu poderia manter a pilha de diretórios no shell bifurcado?

    
por ricab 09.09.2013 / 12:05

1 resposta

1

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'
    
por 09.09.2013 / 19:20