path 라는 변수가 있고 release/linux/x86
다른 디렉토리(즉, ../../..
현재 작업 디렉토리)의 상대 경로를 원한다고 가정해 보겠습니다. 쉘 명령(또는 GNU Make)에서 이를 어떻게 얻을 수 있습니까?
소프트 링크 지원이 필요하지 않습니다.
이 질문은 향상된 용어에 대해 허용되는 답변을 기반으로 크게 수정되었습니다.
답변1
그 목적이 전혀 명확하지는 않지만 다음을 사용하여 요청한 내용을 정확하게 수행합니다.GNU 실제 경로:
realpath -m --relative-to=release/linux/x86 .
../../..
realpath -m --relative-to=release///./linux/./x86// .
../../..
답변2
다음은 디스크나 넷 액세스 없이 문자열 조작만 사용하여(쉘 매개변수 확장을 통해) 소스에서 대상 디렉토리까지의 상대 경로를 반환하는 쉘 함수입니다. 경로 이름 없음 해결 수행.
두 개의 매개변수 source-dir 및 target-dir이 필요합니다. 둘 다 절대 정규화된 비어 있지 않은 경로 이름입니다. 둘 중 하나는 /
종료될 수 있고 둘 중 하나도 존재할 필요가 없습니다. void인 경우 후행 $REPLY
없이 source-dir에서 target-dir까지의 상대 경로로 쉘 변수의 결과를 반환합니다 ./
.
알고리즘은 2005년 comp.unix.shell 게시에서 가져온 것입니다.archive.org.
pnrelpath() {
set -- "${1%/}/" "${2%/}/" '' ## '/'-end to avoid mismatch
while [ "$1" ] && [ "$2" = "${2#"$1"}" ] ## reduce $1 to shared path
do set -- "${1%/?*/}/" "$2" "../$3" ## source/.. target ../relpath
done
REPLY="${3}${2#"$1"}" ## build result
# unless root chomp trailing '/', replace '' with '.'
[ "${REPLY#/}" ] && REPLY="${REPLY%/}" || REPLY="${REPLY:-.}"
}
로 사용
$ pnrelpath "$HOME" "$PWD"
projects/incubator/nspreon
$ pnrelpath "$PWD" "$gimpkdir"
../../../.config/GIMP
$ pnrelpath "$PWD" "$(cd "$dirnm" && pwd || false)"
# using cd to resolve, canonicalize ${dirnm}
또는URI공유 scheme://authority
,
$ pnrelpath 'https://example.com/questions/123456/how-to' 'https://example.com/media'
../../../media
업데이트2022-11-24
while
이전 함수의 문을 건너뛰면 realpath --relative-base
대상이 소스 내부 또는 아래에 있는 경우 소스에서 대상 디렉터리까지의 상대 경로, 그렇지 않으면 절대 경로가 반환됩니다. 유사한 사전 및 사후 조건이 적용됩니다.
pnrelbase() {
set -- "${1%/}/" "${2%/}/" ## '/'-end to avoid mismatch
REPLY="${2#"$1"}" ## build result
# unless root chomp trailing '/', replace '' with '.'
[ "${REPLY#/}" ] && REPLY="${REPLY%/}" || REPLY="${REPLY:-.}"
}
(업데이트 종료)