シェルスクリプトでシンボリックリンクを解決しながらその絶対パスを取得するには

シェルスクリプトで、シンボリックリンクを実体ファイルのパスに変換しながら、相対パスを絶対パスに変換するには、以下のような関数でできる。

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
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク