디렉터리 트리를 더 빠르게 반환하기 위해 .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에서는 필수는 아닙니다.:
특수 파일 이름 dot-dot은 이전 파일의 상위 디렉터리를 참조해야 합니다. 특별한 경우로, 루트 디렉터리에서 점-점은 루트 디렉터리 자체를 참조할 수 있습니다.
/..
기본적으로 쉘이 아닌 다른 시스템에서도 호출하지 않고 호출 /
하면 실행됩니다 .cd
-P
cd -L
논리적 cd
, 어디서, 언제 $PWD
( /a/b/c
다른 디렉토리에 대한 심볼릭 링크가 어디에 있거나 가장 가능성 /a
이 높음)를 수행하고 예를 들어 을 수행 하는 대신 수행 하고 을 수행하는 경우 다음 을 수행합니다 (예:/a/b
/a/b/c
cd ../..
chdir("../..")
cd
chdir("/a")
cd ../../../../../../..
cd
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"
}