f() # Wrapped in a function to verify all test cases.
{
[[ $2 = /* ]]||p=$1
realpath -sm $p/$2
unset p # Not required in a full program.
}
f "/a/b/c" "d"
f "/a/b/c/" "d"
f "/a/b/c/" "d/"
f "/a/b/c" "/d"
f "/a/b/c" "/d/"
f "/../a/b/c/" "d"
f "/a/../b/c/" "d"
f "/a/b/../c" "d"
f "/a/b/c/.." "d"
f "/a/b/c/" ".."
f "/a/b/c" "../d"
f "/a/b/c" "/../d"
f "/a/b/c" ""
f "/a/b/c" "."
f "/a/b/c" "./d"
f "/a/b/c" "/./d"
f "/a/b/c" "d.txt"
f "/a/b/c" "d."
f "/a/b/c" ".txt"
f "/a/b/c" ".txt/d"
f "/a/b/." "./././."
f "/direc" "tory"
f "/a-_.b/" "__._-."
f "/a/b" "../.."
f "/a/b" "../../.."
f "/a" "../../.."
f "/" ""
f "/" "a"
f "/.." "a"
f "/." ""
ZigpICAgICAgICAgICAgICAgICAgICAgIyBXcmFwcGVkIGluIGEgZnVuY3Rpb24gdG8gdmVyaWZ5IGFsbCB0ZXN0IGNhc2VzLgp7CglbWyAkMiA9IC8qIF1dfHxwPSQxCglyZWFscGF0aCAtc20gJHAvJDIKCXVuc2V0IHAgICAgICAgICAgICAgIyBOb3QgcmVxdWlyZWQgaW4gYSBmdWxsIHByb2dyYW0uCn0KCmYgIi9hL2IvYyIgICAgICAiZCIKZiAiL2EvYi9jLyIgICAgICJkIgpmICIvYS9iL2MvIiAgICAgImQvIgpmICIvYS9iL2MiICAgICAgIi9kIgpmICIvYS9iL2MiICAgICAgIi9kLyIKZiAiLy4uL2EvYi9jLyIgICJkIgpmICIvYS8uLi9iL2MvIiAgImQiCmYgIi9hL2IvLi4vYyIgICAiZCIKZiAiL2EvYi9jLy4uIiAgICJkIgpmICIvYS9iL2MvIiAgICAgIi4uIgpmICIvYS9iL2MiICAgICAgIi4uL2QiCmYgIi9hL2IvYyIgICAgICAiLy4uL2QiCmYgIi9hL2IvYyIgICAgICAiIgpmICIvYS9iL2MiICAgICAgIi4iCmYgIi9hL2IvYyIgICAgICAiLi9kIgpmICIvYS9iL2MiICAgICAgIi8uL2QiCmYgIi9hL2IvYyIgICAgICAiZC50eHQiCmYgIi9hL2IvYyIgICAgICAiZC4iCmYgIi9hL2IvYyIgICAgICAiLnR4dCIKZiAiL2EvYi9jIiAgICAgICIudHh0L2QiCmYgIi9hL2IvLiIgICAgICAiLi8uLy4vLiIKZiAiL2RpcmVjIiAgICAgICJ0b3J5IgpmICIvYS1fLmIvIiAgICAgIl9fLl8tLiIKZiAiL2EvYiIgICAgICAgICIuLi8uLiIKZiAiL2EvYiIgICAgICAgICIuLi8uLi8uLiIKZiAiL2EiICAgICAgICAgICIuLi8uLi8uLiIKZiAiLyIgICAgICAgICAgICIiCmYgIi8iICAgICAgICAgICAiYSIKZiAiLy4uIiAgICAgICAgICJhIgpmICIvLiIgICAgICAgICAgIiI=