Bash
解析相對路徑而不解析 bash 中的符號連結
我正在尋找一種可移植的方法來將相對路徑解析為絕對路徑,同時不解析任何符號連結。
例如,
/home/nat/cat/bat/hat.sh
在 bash 中執行以下文件:set -x pwd # cat is a symlink readlink -e .. # abs is an imaginary function that returns the path in the form specified by this question abs .. abs /home/./nat/../nat/cat
輸出:
+ pwd /home/nat/cat/bat + readlink -e .. /home/nat/cat-1.12.0 + abs .. /home/nat/cat + abs /home/./nat/../nat/cat /home/nat/cat
不幸的是,我不能使用
realpath -s
它,因為它在 OSX 上預設不可用。
這就是您的虛函式看起來如何實現的方式:
abs () { local _PWD _BN [ -d "${1}" ] && _PWD="${1}" [ -f "${1}" ] && { _PWD=$(dirname "${1}") ; _BN=/$(basename "${1}") ;} pushd $_PWD >/dev/null echo $(pwd)${_BN} popd >/dev/null }
您可以將文件或目錄路徑作為參數傳遞。然後它將轉到指定的路徑並列印出工作目錄,這就是你想要的。根據您的特定需求,您可能希望針對空參數、不存在的路徑或權限不足等添加一些驗證 - 我在此範例中省略了這一點。
該
pushd/popd
對執行跳轉到目標並返回
>/dev/null
防止這些命令列印出它們預設執行的目錄堆棧,這會破壞所需的輸出