เพื่อไม่ขึ้นกับrealpath
สิ่งที่ไม่พร้อมใช้งานอย่างสม่ำเสมอและลดการพึ่งพาให้น้อยที่สุดฉันจึงได้สิ่งนี้ขึ้นมา (ใช้ความช่วยเหลือเล็กน้อยจากคำตอบนี้ ):
function relative_path_from_to() {
# strip trailing slashes
path1=${1%\/}
path2=${2%\/}
# common part of both paths
common=$(printf '%s\x0%s' "${path1}" "${path2}" | sed 's/\(.*\).*\x0\1.*/\1/')
# how many directories we have to go up to the common part
up=$(grep -o "/" <<< ${path1#$common} | wc -l)
# create a prefix in the form of ../../ ...
prefix=""; for ((i=0; i<=$up; i++)); do prefix="$prefix../"; done
# return prefix plus second path without common
printf "$prefix${2#$common}"
}
วางเปลือกย่อยเพื่อค้นหาส่วนทั่วไปของทั้งสองเส้นทาง บางทีคุณอาจจะชอบ - เหมาะกับฉัน