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?
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 atfor dir in $(cat $_DIRS_FILE);do
\cd $dir >/dev/null 2>&1# Just need the first linebreakdone# Restore saved dir stack in reverse order.for dir in $(cat $_DIRS_FILE | tac);do# But don't duplicate the directory we left off atif[[ $PWD != $dir ]];then
\pushd -n $dir >/dev/null 2>&1fidone}# 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
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.
Réponses:
Que diriez-vous d'utiliser la
dirs -p
sortie?Vous pouvez le sauvegarder
.bash_logout
et le recharger avec un script mineur dans le dossier.bash_login
Voir plus à Directory Stack Builtins bash page.
la source
pushd
etpopd
pour viderdirs -p
un fichier sur chaque utilisation.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_ID
charge 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:BASH_SESSION_ID
est utilisé plutôt que directement, deSHELL_SESSION_ID
sorte que pour les environnements qui n'en ont pasSHELL_SESSION_ID
, quelque chose d'autre puisse être utilisé.Le contenu de
.bash_dirs
est ceci:la source
.bash_dirs
pour le téléchargement en ligne de commande: pastebin.com/raw/FsAcG23N