函数似乎无法打印出错误消息

函数似乎无法打印出错误消息

我在 .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 个注意事项外,它工作得很好:

  1. 当该函数运行并且我可以在目录树中移回时,如果我尝试超出限制(根“/”),该函数不会打印出错误消息。所以基本上这部分

    if ! cd "$x"; then
        echo "$msg";
    fi
    

    只是什么也没做。

  2. 如果我删除该部分(打印错误消息的 if 语句),该函数将不再起作用。


谁能帮我让错误消息部分正常工作吗?另外,如果有人能解释为什么删除错误消息部分会破坏该功能,那就太好了。

答案1

在大多数系统上,路径指的是与根目录/..相同的文件。/这是允许的,但 POSIX 不要求:

特殊文件名点-点应引用其前任目录的父目录。作为特殊情况,在根目录中,点-点可以指根目录本身。

/..即使在与 不同的系统上/,当您在cd没有 的情况下调用时-P,默认cd -L情况下 shell 会执行逻辑的 cd,其中,当$PWDis /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"
}

相关内容