cd -
可以移动到上次访问的目录。除了上一个历史之外,我们还能参观更多历史吗?
答案1
您没有指定您正在使用哪个 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'
结果:
答案2
您正在寻找的命令是pushd
和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
答案3
回答你关于“更多历史”的问题。不,cd -
Bash 中的功能仅支持您可以“翻转”回的单个目录。正如@Ramesh 在他的回答中所说。如果您想要更长的目录历史记录,可以使用pushd
和popd
来保存目录或返回到上一个目录。
您还可以使用该命令查看堆栈中当前内容的列表dirs
。
详细的解释可以从这个标题中找到:如何使用 Pushd 和 Popd 命令?。
答案4
你想要多少历史就有多少:
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"
}
这是一个 shell 函数,应该使任何 POSIX 兼容 shell 能够提供zsh
-stylecd
历史记录。它在不调用单个子 shell 的情况下完成所有工作,而且我相信它的流程非常合理 - 在适度的测试下它似乎可以正确处理所有情况。
该函数尝试尽可能地与环境配合,同时仍然依赖于完全可移植的语法 - 它只做出一个假设,即$DIRSTACK
环境变量是其可以随意使用的属性。
它规范化它存储的所有路径,$DIRSTACK
并将所有路径序列化在单引号上 - 尽管它确保每个路径在将其添加到变量的值之前都被安全地引用和序列化,并且不应该对任何类型的任何特殊字符有任何问题。如果$DIRSTACKMAX
设置了环境变量,它将使用它作为历史记录中保留的路径数量的上限,否则限制为 1。
如果您加载该功能,您将像平常一样cd
,但也可以cd -[num]
通过更改目录历史记录进行回溯。
该函数的主要机制是cd
其本身和${OLD,}PWD
环境变量。 POSIX 指定cd
为每个路径移动更改这些值 - 因此这仅使用 shell 的内置变量并根据需要保存这些值。