나는 또 다른 구현에 더미 싫지만)는 필요 휴대용, 순수한 쉘 구현 하고, b)는 단위 테스트 범위 , 이런 일에 대한 가장자리 케이스의 수만큼 사소하지 않은 .
테스트 및 전체 코드 는 Github 프로젝트를 참조하십시오 . 다음은 구현의 개요입니다.
키이스 스미스 (Keith Smith)는 다음과 같이 지적한다 readlink -f
. 1) 심볼릭 링크를 재귀 적으로 해결하고 2) 결과를 정규화한다
realpath() {
canonicalize_path "$(resolve_symlinks "$1")"
}
먼저 symlink resolver 구현 :
resolve_symlinks() {
local dir_context path
path=$(readlink -- "$1")
if [ $? -eq 0 ]; then
dir_context=$(dirname -- "$1")
resolve_symlinks "$(_prepend_path_if_relative "$dir_context" "$path")"
else
printf '%s\n' "$1"
fi
}
_prepend_path_if_relative() {
case "$2" in
/* ) printf '%s\n' "$2" ;;
* ) printf '%s\n' "$1/$2" ;;
esac
}
이것은 전체 구현 의 약간 단순화 된 버전입니다 . 전체 구현은 symlink주기에 대한 작은 검사를 추가 하고 출력을 약간 마사지합니다.
마지막으로 경로를 표준화하는 기능 :
canonicalize_path() {
if [ -d "$1" ]; then
_canonicalize_dir_path "$1"
else
_canonicalize_file_path "$1"
fi
}
_canonicalize_dir_path() {
(cd "$1" 2>/dev/null && pwd -P)
}
_canonicalize_file_path() {
local dir file
dir=$(dirname -- "$1")
file=$(basename -- "$1")
(cd "$dir" 2>/dev/null && printf '%s/%s\n' "$(pwd -P)" "$file")
}
그게 다야. 스크립트에 붙여 넣기는 간단하지만 사용 사례에 대한 단위 테스트가없는 코드에 의존하기에는 까다로울 수 있습니다.
readlink
내장 명령이나 외부 명령 일 수 있으므로 관련이 있습니다.