概要
シンボリックリンク(ショートカット)が実際に指し示している「実体ファイルのパス」を取得するためのコマンドです。
ls -l でもリンク先を確認できますが、readlink はリンク先パスのみを標準出力するため、シェルスクリプト内で「実行ファイルの絶対パスを特定したい」といった場面で非常に重宝します。特に -f オプションを使うことで、相対パスを絶対パスに変換したり、多重に張られたリンクを最後まで辿って解決したりすることができます。
仕様(引数・オプション)
構文
readlink [オプション] ファイル名
主な引数・オプション
| オプション | 説明 |
-f | すべてのシンボリックリンクを再帰的に辿り、絶対パス(完全なパス)として出力します(canonicalize)。最後の構成要素以外は存在している必要があります。 |
-e | -f と同様に絶対パス化しますが、パスに含まれるすべての構成要素が存在している必要があります。存在しない場合は何も出力せずエラー終了します。 |
-m | -f と同様に絶対パス化しますが、ファイルやディレクトリの実在チェックを行いません。 |
-n | 末尾に改行を出力しません。 |
-z | 出力の末尾を改行ではなくヌル文字(\0)にします。 |
-q, -s | エラーメッセージを表示しません(quiet/silent)。 |
基本の使い方
オプションなしでシンボリックリンクファイルを指定すると、そのリンクが指しているパス(相対パスの場合はそのまま)を表示します。
コマンド
# シンボリックリンク current_app がどこを指しているか確認
readlink current_app
実行結果
./versions/v1.0.2
実践コマンド
多重リンクを解決して実体の絶対パスを取得する
リンクが「リンクのリンク」になっている場合や、相対パスが含まれる場合でも、-f オプションを使えば最終的な絶対パスを一発で取得できます。これが最も利用頻度の高い使い方です。
# /usr/bin/editor が指す最終的な実体パスを調べる
# (例: editor -> /etc/alternatives/editor -> /usr/bin/vim.basic)
readlink -f /usr/bin/editor
/usr/bin/vim.basic
リンク先の存在確認を行う(スクリプト向け)
-e オプションは、リンク先の実体が存在しない場合(リンク切れなど)に終了ステータス 1 (失敗) を返します。これを利用して、リンクが有効な場合のみ処理を行う記述が可能です。
# リンク先が存在するかチェックする
# 正常なリンクの場合
readlink -e /usr/bin/python3
echo "Status: $?"
# リンク切れ、または存在しないファイルの場合
readlink -e /usr/bin/invalid_link
echo "Status: $?"
/usr/bin/python3.10
Status: 0
Status: 1
※ Statusが 1 の場合、コマンドは何も出力せずに終了します。
カスタムポイント
- 絶対パス化: シンボリックリンクではない通常のファイルを指定した場合、
readlink -fはそのファイルの絶対パスを返します。単純に「ファイルのフルパスを知りたい」時にも使えます。 - スクリプト内での利用: 変数代入と相性が良く、
REAL_PATH=$(readlink -f "$TARGET_FILE")のように記述してパスを正規化します。
注意点
- macOS (BSD版) との違い:Linux標準の readlink (GNU版) と、macOSなどに搭載されているBSD版 readlink は挙動が大きく異なります。BSD版には -f オプション(正規化機能)が標準では存在しない場合があるため、クロスプラットフォームなスクリプトを書く際は注意が必要です(代わりに realpath コマンドの使用が推奨されることがあります)。
- -f と -m の使い分け:これから作成するディレクトリの絶対パスを知りたい場合など、対象がまだ存在しないパスに対しては -f や -e ではなく -m (missing) を使用してください。
応用
シェルスクリプト自身のディレクトリを取得する
スクリプトがどこから実行されても、スクリプトファイルが存在するディレクトリを起点に処理を行いたい場合によく使われるイディオムです。
#!/bin/bash
# このスクリプトファイル自体の絶対パスを取得し、ディレクトリ部分を抽出
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
echo "スクリプトの場所: $SCRIPT_DIR"
# $SCRIPT_DIR/config.conf などを読み込む処理へ続く...
まとめ
readlinkコマンド、特に -f オプションは、複雑に入り組んだディレクトリ構造やシンボリックリンクを人間が解読する手間を省き、システムが認識している「正解のパス」を提示してくれます。手動での調査だけでなく、堅牢なシェルスクリプトを作成する上でのパス解決手段として、pwd や ls と並んで必須の知識となります。
