Vous souvenez-vous de la pile de répertoires bash d'une session à l'autre?

2

Bash se souviendra de l'historique des commandes d'une session à l'autre, mais pas de la pile de répertoires créée avec pushd. Est-il possible de se souvenir de la pile de répertoires également?

Matthew Cline
la source
Merci de partager votre solution, mais postez-la comme réponse et non dans votre question initiale.
Mpy

Réponses:

1

Que diriez-vous d'utiliser la dirs -psortie?
Vous pouvez le sauvegarder .bash_logoutet le recharger avec un script mineur dans le dossier.bash_login

Voir plus à Directory Stack Builtins bash page.

nik
la source
1
J'avais initialement rejeté cette idée, car si bash se termine de manière anormale ou si bash n'est pas un shell de connexion, cela ne fonctionnera pas. Mais je pouvais créer un alias pushdet popdpour vider dirs -pun fichier sur chaque utilisation.
Matthew Cline
3

J'ai enfin trouvé un moyen de déterminer le shell dans lequel je me trouve de manière cohérente d'une session à l'autre: la variable d'environnement prise en SHELL_SESSION_IDcharge par le gestionnaire de sessions KDE pour Konsole (pas sûr des autres environnements de bureau). Cela dit, la solution que j'ai élaborée à partir de la réponse de l'utilisateur nik:

Dans .bashrc, dans le code d'installation des shells interactifs, j'ai ajouté ceci:

# 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_IDest utilisé plutôt que directement, de SHELL_SESSION_IDsorte que pour les environnements qui n'en ont pas SHELL_SESSION_ID, quelque chose d'autre puisse être utilisé.

Le contenu de .bash_dirsest ceci:

_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
Matthew Cline
la source
Raw pastebin de ce qui précède .bash_dirspour le téléchargement en ligne de commande: pastebin.com/raw/FsAcG23N
starbeamrainbowlabs
Pour tous ceux qui s’interrogent sur la barre oblique inversée ("\") figurant dans la plupart des commandes ci-dessus: elle ignore tous les alias possibles et n’exécute que la commande par défaut de ce nom.
Edward le