Lembre-se da pilha de diretórios bash nas sessões?

2

O Bash se lembrará do histórico de comandos nas sessões, mas não da pilha de diretórios criada com pushd . Existe alguma maneira de lembrar a pilha de diretórios também?

    
por Matthew Cline 17.06.2013 / 07:43

2 respostas

1

Que tal usar o dirs -p output?
Você poderia salvá-lo do seu .bash_logout e ordená-lo novamente com um script menor no .bash_login

Veja mais em Diretório Stack Builtins página bash .

    
por 17.06.2013 / 15:58
3

Eu finalmente encontrei uma maneira de determinar em qual shell eu estou em todas as sessões: a variável de ambiente SHELL_SESSION_ID , que o gerenciador de sessões do KDE suporta para o Konsole (não tenho certeza sobre outros ambientes de desktop). Com isso dito, a solução que eu coloquei com base na resposta do usuário nik:

Em .bashrc , no código de configuração para shells interativos, adicionei isso:

# Don't remember directory stacks for subshells, just the top level
# shell.
if [[ -z "$BASH_SESSION_ID" ]]; then
    # Get bash-session the X Windows session manager, if possible.
    if [[ -n "$SHELL_SESSION_ID" ]]; then
        export BASH_SESSION_ID=$SHELL_SESSION_ID
    else
        export BASH_SESSION_ID="DEFAULT"
    fi
    .  ~/.bash_dirs
    load_dirs
fi

BASH_SESSION_ID é usado em vez de usar diretamente SHELL_SESSION_ID , de modo que, para ambientes que não têm SHELL_SESSION_ID , outra coisa pode ser usada.

O conteúdo de .bash_dirs é este:

_DIRS_DIRS=~/.dirs

# Silently make sure ~/.dirs exists
\mkdir -p $_DIRS_DIRS

_DIRS_FILE=$_DIRS_DIRS/$BASH_SESSION_ID

save_dirs() {
    \dirs -l -p > $_DIRS_FILE
}

load_dirs() {
    # Start out with a fresh directory stack.
    \dirs -c

    # Make sure there's at least an empty file.
    if [[ ! -f "$_DIRS_FILE" ]]; then
        touch $_DIRS_FILE
    fi

    # Start out in the directory we left off at
    for dir in $(cat $_DIRS_FILE) ; do
        \cd $dir  > /dev/null 2>&1

        # Just need the first line
        break
    done

    # Restore saved dir stack in reverse order.
    for dir in $(cat $_DIRS_FILE | tac) ; do
        # But don't duplicate the directory we left off at
        if [[ $PWD != $dir ]]; then
            \pushd -n $dir > /dev/null 2>&1
        fi
    done
}

# NOTE: aliases can't take parameters, so we have to alias to functions.

_dirs_pushd()
{
    \pushd "$@"
    save_dirs
}
alias pushd=_dirs_pushd

_dirs_popd()
{
    \popd "$@"
    save_dirs
}
alias popd=_dirs_popd

# In case 'dirs -c' is used.
_dirs_dirs()
{
    \dirs "$@"
    save_dirs
}
alias dirs=_dirs_dirs
    
por 16.02.2014 / 10:05

Tags