함수가 오류 메시지를 인쇄할 수 없는 것 같습니다.

함수가 오류 메시지를 인쇄할 수 없는 것 같습니다.

디렉터리 트리를 더 빠르게 반환하기 위해 .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에서는 필수는 아닙니다.:

특수 파일 이름 dot-dot은 이전 파일의 상위 디렉터리를 참조해야 합니다. 특별한 경우로, 루트 디렉터리에서 점-점은 루트 디렉터리 자체를 참조할 수 있습니다.

/..기본적으로 쉘이 아닌 다른 시스템에서도 호출하지 않고 호출 /하면 실행됩니다 .cd-Pcd -L논리적 cd, 어디서, 언제 $PWD( /a/b/c다른 디렉토리에 대한 심볼릭 링크가 어디에 있거나 가장 가능성 /a이 높음)를 수행하고 예를 들어 을 수행 하는 대신 수행 하고 을 수행하는 경우 다음 을 수행합니다 (예:/a/b/a/b/ccd ../..chdir("../..")cdchdir("/a")cd ../../../../../../..cdchdir("/")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"
}

관련 정보