2

Bash запомнит историю команд между сеансами, но не стек каталогов, созданный с помощью pushd . Есть ли способ запомнить стек каталогов?

2 ответа2

3

Наконец-то я нашел способ определить, в какой оболочке я нахожусь в разных сессиях: переменная окружения 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
1

Как насчет использования вывода dirs -p ?
Вы можете сохранить его из вашего .bash_logout и перегрузить его второстепенным скриптом в .bash_login

См. Больше на странице bash Встроенных директорий Stack .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .