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