Для обеспечения работы -P|-L|- используйте следующее:
function cd () { typeset arg= case $1 in -|-L|-P) arg=$1 ; shift ;; esac [ $# -gt 1 ] && { builtin cd $arg "${PWD/$1/$2}" } || { builtin cd $arg "$@" } }