Bash

解析相對路徑而不解析 bash 中的符號連結

  • November 23, 2018

我正在尋找一種可移植的方法來將相對路徑解析為絕對路徑,同時不解析任何符號連結。

例如,/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防止這些命令列印出它們預設執行的目錄堆棧,這會破壞所需的輸出

引用自:https://unix.stackexchange.com/questions/483492