Bash запомнит историю команд между сеансами, но не стек каталогов, созданный с помощью pushd
. Есть ли способ запомнить стек каталогов?
2 ответа
Наконец-то я нашел способ определить, в какой оболочке я нахожусь в разных сессиях: переменная окружения SHELL_SESSION_ID
, которую менеджер сессий KDE поддерживает для Konsole (не уверен в других средах рабочего стола). С учетом сказанного, решение, которое я собрал, основано на ответе пользователя nik:
В .bashrc
, в коде установки для интерактивных оболочек, я добавил это:
# 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
используется вместо непосредственного использования SHELL_SESSION_ID
поэтому для сред, в которых нет SHELL_SESSION_ID
, можно использовать что-то еще.
Содержимое .bash_dirs
это:
_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
Как насчет использования вывода dirs -p
?
Вы можете сохранить его из вашего .bash_logout
и перегрузить его второстепенным скриптом в .bash_login
См. Больше на странице bash Встроенных директорий Stack .