シェルスクリプトでシンボリックリンクを解決しながらその絶対パスを取得するには 2016/10/04
シェルスクリプトで、シンボリックリンクを実体ファイルのパスに変換しながら、相対パスを絶対パスに変換するには、以下のような関数でできる。
readlink
コマンドでシンボリックリンクを再帰的に解決させる。
read_real_path() {
local cwd="$(pwd)"
local path="$1"
while [ -n "$path" ]; do
if [ "${path%/*}" != "$path" ]; then
cd "${path%/*}" # $path に含まれる最後の "/" から後ろを削除したパスにcd
fi
local name="${path##*/}" # $path に含まれる最後の "/" から後ろを name に代入
path="$(readlink "$name" || true)"
done
echo $(pwd)/$name
cd "$cwd"
}
# シェルスクリプト自身の絶対パスを取得する例
SCRIPT_PATH="$(read_real_path $0)"
echo $SCRIPT_PATH
これをちょっと修正して、シェルスクリプトファイル自身の置かれているディレクトリを絶対パスを取得する例
read_parent_dir() {
local cwd="$(pwd)"
local path="$1"
while [ -n "$path" ]; do
if [ "${path%/*}" != "$path" ]; then
cd "${path%/*}" # $path に含まれる最後の "/" から後ろを削除したパスにcd
fi
local name="${path##*/}" # $path に含まれる最後の "/" から後ろを name に代入
path="$(readlink "$name" || true)"
done
pwd
cd "$cwd"
}
SCRIPT_HOME="$(read_parent_dir $0)"
echo $SCRIPT_HOME