Пораскинул немного мозгами и сделал такой вариант:
(из плюсов - пути могут не существовать, нормализуются, симлинки не резолвятся)
Код
#!/bin/bash
if [ -z "$1" -o -z "$2" ]; then
echo "$(basename "$0"): No FROM and/or TO path(s)." >&2
echo "Usage: " >&2
echo " $(basename "$0") from_path to_path" >&2
exit 1
fi
FROM="$(realpath -s "$1")"
TO="$(realpath -s "$2")"
HEAD="$FROM"
LUP=""
while [ "$(echo "$TO/" | grep "^$HEAD/")" != "$TO/" -a "$HEAD" != "/" ]; do
HEAD="$(dirname "$HEAD")"
LUP="../$LUP"
done
if [ -z "$LUP" ]; then LUP="./"; fi
TAIL="$(echo "$TO" | sed "s|^$HEAD||" | sed 's|^/||')"
echo "${LUP}${TAIL}"
exit 0