还记得跨会话的 bash 目录堆栈吗?

还记得跨会话的 bash 目录堆栈吗?

Bash 会记住会话间的命令历史记录,但不会记住用 创建的目录堆栈pushd。有没有办法也能记住目录堆栈?

答案1

如何使用dirs -p输出?
你可以从你的保存它.bash_logout,然后用一个小脚本重新加载它.bash_login

更多信息请访问目录堆栈内置函数bash 页面。

答案2

我终于找到了一种方法来确定我在各个会话中始终处于哪个 shell 中:环境变量SHELL_SESSION_ID,KDE 会话管理器支持 Konsole(不确定其他桌面环境是否支持)。话虽如此,我根据用户 nik 的回答整理出的解决方案是:

.bashrc交互式 shell 的设置代码中,我添加了以下内容:

# 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

答案3

虽然这并不是您所问的,但它可能很方便使用,tmux它基本上允许存储、分离和重新连接多个终端会话(但也更像拆分窗口等),从而为每个上下文(会话)“存储工作目录”。

一些基本用法:

  • tmux– 创建新的 tmux 会话,并附加到它
  • ctrl+b d– 退出 tmux 会话
  • tmux ls– 显示 tmux 会话列表
  • 每个会话都有一个名称,当使用时tmux,该名称以数字形式给出(最不自然的未占用),但也可以指定它:tmux new-session -s reasonable_session_name
  • 进入先前创建的会话:(tmux a -t reasonable_session_nametmux a -t 1
  • 在每个 tmux 会话中,可以创建“窗口”(ctrl+b c)并在它们之间切换(ctrl+b window_number)。在简单情况下,每个窗口都是单独的终端会话
  • 在每个窗口内,可以创建堆叠(水平和/或垂直)的“面板”,以同时显示多个终端
  • ...

相关内容