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)
结果:

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)
slm*_*slm 13
回答您关于“更多历史”的问题。不cd -,Bash 中的功能仅支持您可以“翻转”回的单个目录。正如@Ramesh 在他的回答中所说。如果您想要更长的目录历史记录,您可以使用pushd和popd保存目录或返回上一个目录。
您还可以使用该dirs命令查看堆栈中当前内容的列表。
可以从标题为的答案中找到详细说明:如何使用 pushd 和 popd 命令?.
您可以为 bash安装和使用我的dirhistory实用程序。
基本上,它是一个从所有 shell 收集目录更改的守护程序,以及一个显示历史记录并让您选择要切换到的目录的 Cdk 程序(因此您不仅限于堆栈)。
您拥有任意数量的历史记录:
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 的内置变量并根据需要保存值。