我们有更多关于 cd 的历史吗?

Tim*_*Tim 51 shell bash zsh cd-command pushd

cd -可以移动到上次访问的目录。除了上一篇之外,我们还能参观更多的历史吗?

jim*_*mij 71

你没有指定你使用的是哪个 shell,所以让它成为宣传 zsh 的借口。

是的,我们有更多的历史cd,即cd -2,cd -4等很方便的cd -TAB,尤其是完成系统并启用颜色:

这是我在 .zshrc 中的内容:

setopt AUTO_PUSHD                  # pushes the old directory onto the stack
setopt PUSHD_MINUS                 # exchange the meanings of '+' and '-'
setopt CDABLE_VARS                 # expand the expression (allows 'cd -2/tmp')
autoload -U compinit && compinit   # load + start completion
zstyle ':completion:*:directory-stack' list-colors '=(#b) #([0-9]#)*( *)==95=38;5;12'
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

  • 除非问题专门询问“bash”,否则这是一个有效的答案。不要删除它。 (27认同)
  • 好的,我不会删除这个答案,也许对其他人有用。 (9认同)
  • bash bash bash bash (4认同)
  • 值得一提的是,除了`setopt AUTO_PUSHD`,上述任何设置都不是*必需*的,以获得一个无所不在的目录堆栈,并在库存zsh中完成。`PUSHD_MINUS` 颠倒了 `cd +` 和 `cd -` 的意义(口味问题),`CDABLE_VARS` 与目录堆栈无关,这里给出的 `zstyle` 调用只是为目录堆栈的输出添加了颜色完成。然而,必须使用 `autoload -U compinit && compinit` 初始化完成子系统。 (3认同)
  • 不错的功能,不知道 zsh 有这个功能。 (2认同)

Ram*_*esh 35

您正在寻找的命令是pushdand popd。

您可以查看的实际工作示例pushd和popd来自这里。

mkdir /tmp/dir1
mkdir /tmp/dir2
mkdir /tmp/dir3
mkdir /tmp/dir4

cd /tmp/dir1
pushd .

cd /tmp/dir2
pushd .

cd /tmp/dir3
pushd .

cd /tmp/dir4
pushd .

dirs
/tmp/dir4 /tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1
Run Code Online (Sandbox Code Playgroud)

  • @ivy_lynx `OLDPWD` 存在于所有 POSIX shell 中,但是对于这个询问如何超越它的问题没有用(该问题已经提到 `cd -`,它是 `cd "$OLDPWD"` 的快捷方式)。 (4认同)
  • 您是否有理由使用 `cd /tmp/dir1; pushd .` 而不是`pushd /tmp/dir1`? (2认同)

slm*_*slm 13

回答您关于“更多历史”的问题。不cd -,Bash 中的功能仅支持您可以“翻转”回的单个目录。正如@Ramesh 在他的回答中所说。如果您想要更长的目录历史记录,您可以使用pushd和popd保存目录或返回上一个目录。

您还可以使用该dirs命令查看堆栈中当前内容的列表。

可以从标题为的答案中找到详细说明:如何使用 pushd 和 popd 命令?.


cjm*_*cjm 8

您可以为 bash安装和使用我的dirhistory实用程序。

基本上,它是一个从所有 shell 收集目录更改的守护程序,以及一个显示历史记录并让您选择要切换到的目录的 Cdk 程序(因此您不仅限于堆栈)。


mik*_*erv 7

您拥有任意数量的历史记录:

cd() {
[ "$((${DIRSTACKMAX##*[!0-9]*}0/10))" -gt 0 ] &&
        set -- "$@" "$DIRSTACK"               &&
        DIRSTACK='pwd -P >&3; command cd'     ||
        { command cd "$@"; return; }
_q()    while   case "$1" in (*\'*) :   ;;      (*)
                ! DIRSTACK="$DIRSTACK '$2$1'"   ;;esac
        do      set -- "${1#*\'}" "$2${1%%\'*}'\''"
        done
while   [ "$#" -gt 1 ]
do      case    ${1:---} in (-|[!-]*|-*[!0-9]*) : ;;
        (*)     eval "  set $((${1#-}+1))"' "${'"$#}\""
                eval '  set -- "$2"'" $2"'
                        set -- "${'"$1"'}" "$1"'
        ;;esac; _q "$1"; shift
done
eval "  DIRSTACK=; $DIRSTACK    &&"'
        _q "$OLDPWD"            &&
        DIRSTACK=$DIRSTACK\ $1
        set "$?" "${DIRSTACK:=$1}"'" $1
"       3>/dev/null
[ "$(($#-1))" -gt "$DIRSTACKMAX" ] &&
        DIRSTACK="${DIRSTACK% \'/*}"
unset -f _q; return "$1"
}
Run Code Online (Sandbox Code Playgroud)

这是一个 shell 函数,它应该使任何 POSIX 兼容的 shell 能够提供zsh-stylecd历史记录。它在不调用单个子 shell 的情况下完成所有工作,我相信它的流程非常合理——它似乎在适度测试下正确处理所有情况。

该函数试图在其环境中尽可能好地发挥作用,同时仍然依赖于完全可移植的语法——它只做出一个假设,那就是$DIRSTACK环境变量是它的属性。

它规范化它存储的所有路径,$DIRSTACK并在单引号上序列化所有路径- 尽管它确保每个路径在将其添加到变量的值之前都被安全地引用和序列化,并且任何类型的特殊字符都不应该有任何问题. 如果$DIRSTACKMAX设置了环境变量,它将使用它作为它在历史中保留的路径数的上限,否则限制为 1。

如果您cd像往常一样加载该功能,但也可以cd -[num]通过更改目录历史记录进行回溯。

该函数的主要机制是cd它本身——以及${OLD,}PWD环境变量。POSIX 指定cd为每次路径移动更改这些值 - 因此这仅使用 shell 的内置变量并根据需要保存值。