3 回答

TA貢獻1848條經驗 獲得超2個贊
嘗試以下簡單的一線:
對于所有UNIX / OSX / Linux
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
重擊
dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
注意:命令中使用雙破折號(-)表示命令選項的結尾,因此包含破折號或其他特殊字符的文件不會破壞命令。
注意:在Bash中,請使用${BASH_SOURCE[0]},以代替,$0否則在采購(source/ .)時路徑可能會中斷。
對于Linux,Mac和其他* BSD:
cd "$(dirname "$(realpath "$0")")";
注意:realpath默認情況下,應將其安裝在最受歡迎的Linux發行版中(例如Ubuntu),但是某些情況下可能會丟失,因此必須進行安裝。
注意:如果您使用的是Bash,請使用${BASH_SOURCE[0]}代替$0,否則在采購(source/ .)時路徑可能會中斷。
否則,您可以嘗試類似的方法(它將使用第一個現有工具):
cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"
對于特定于Linux的:
cd "$(dirname "$(readlink -f "$0")")"
在* BSD / Mac上使用GNU readlink:
cd "$(dirname "$(greadlink -f "$0")")"
注意:您需要先coreutils安裝(例如1.安裝Homebrew和2. brew install coreutils)。
重擊
在bash中,您可以使用Parameter Expansions來實現,例如:
cd "${0%/*}"
但是如果腳本是從同一目錄運行的,則無法使用。
另外,您可以在bash中定義以下函數:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
此函數有1個參數。如果參數已經具有絕對路徑,則按原樣打印,否則打印$PWD變量+文件名參數(不帶./前綴)。
或以下是從Debian .bashrc文件中獲取的版本:
function realpath()
{
f=$@
if [ -d "$f" ]; then
base=""
dir="$f"
else
base="/$(basename "$f")"
dir=$(dirname "$f")
fi
dir=$(cd "$dir" && /bin/pwd)
echo "$dir$base"
}
- 3 回答
- 0 關注
- 838 瀏覽
添加回答
舉報