我在 .zshrc 文件中编写了这个小函数,以便更快地返回目录树:
#: Move back x director(y/ies).
function bak ()
{
local x=""
local limit="$1"
local msg="Can't move back $limit directories"
[ -z "$limit" ] && limit=1
for ((i=0;i<limit;i++)); do
x="../$x"
done
if ! cd "$x"; then
echo "$msg";
fi
}
除了 2 个注意事项外,它工作得很好:
当该函数运行并且我可以在目录树中移回时,如果我尝试超出限制(根“/”),该函数不会打印出错误消息。所以基本上这部分
if ! cd "$x"; then echo "$msg"; fi
只是什么也没做。
如果我删除该部分(打印错误消息的 if 语句),该函数将不再起作用。
谁能帮我让错误消息部分正常工作吗?另外,如果有人能解释为什么删除错误消息部分会破坏该功能,那就太好了。
答案1
在大多数系统上,路径指的是与根目录/..
相同的文件。/
这是允许的,但 POSIX 不要求:
特殊文件名点-点应引用其前任目录的父目录。作为特殊情况,在根目录中,点-点可以指根目录本身。
/..
即使在与 不同的系统上/
,当您在cd
没有 的情况下调用时-P
,默认cd -L
情况下 shell 会执行逻辑的 cd
,其中,当$PWD
is /a/b/c
(其中/a
或/a/b
很/a/b/c
可能是到其他目录的符号链接)并且您执行cd ../..
例如,而不是执行chdir("../..")
,cd
则执行chdir("/a")
并且如果您执行cd ../../../../../../..
,则cd
执行 a chdir("/")
(如POSIX 要求)。
另请注意,错误消息应发送至 stderr:
bak() {
local x limit="${1-1}"
repeat "$limit" x+=../
cd "$x" && return
local ret=$?
print -u2 "Can't cd back $limit directories"
return "$ret"
}
尽管该消息可能是多余的,就像cd
失败一样,但它已经写入了错误消息。
如果你想在bak
给定的限制大于 中的组件数量时返回失败$PWD
,你可以这样做:
bak() {
local depth=0 dir=$PWD x
repeat "${1-1}" {
if [[ $dir = / ]]; then
print -u2 "The current working directory is only $depth level deep"
return 1
fi
dir=$dir:h x+=../
((depth++))
}
cd "$x"
}