Q1ln -s target.txt link.txtを実行するとls -lでどう表示されますか?
シンボリックリンクとハードリンク — ln
この記事は、基礎コマンドからシェルスクリプトまでLinuxの実践的なスキルを1からマスターする「Linux入門講座の一部」です。
ln -s target.txt link.txtでパスを格納するシンボリックリンクを作りls -lの -> で確認し、ln base.txt hard.txtで同じ実体を指すハードリンクを作る違いを、図解とブラウザ端末で確認します。
シンボリックリンク — ln -s
リンクは、別の名前から同じファイルにたどり着けるようにする仕組みです。ln -s 実体 名前で作るのがシンボリックリンクで、これは実体へのパス(場所)を格納した特殊なファイルです。名前を開くと、格納された実体のパスをたどって自動的につながります。ls -lで一覧すると、リンクの行に名前 -> 実体のようにリンク先が表示されます。
| 書き方 | 効果 |
|---|---|
ln -s 実体 名前 | -s(symbolic)でパスの別名となるシンボリックリンクを作る |
ls -l | 名前 -> 実体の表示でリンク先を確認する |
ln 実体 別名 | 同じ実体(データ本体)を指すハードリンクを作る |
| シンボリック vs ハード | シンボリック=実体のパスを格納した特殊ファイル / ハード=同じ実体への別名 |
| 実体を削除したとき | シンボリック=たどり先を失い壊れる / ハード=中身は残る |
ln -sは中身としてパス文字列target.txtを格納した特殊ファイルlink.txtを作ります。ls -lではlink.txt -> target.txtと矢印で表示され、cat link.txtはそのパスをたどって実体target.txtの中身を読み出します。printf 'data\n' > target.txt # 実体ファイルを作成
ln -s target.txt link.txt # シンボリックリンクを作る
ls -l # link.txt -> target.txt を確認
cat link.txt # 実体 target.txt の中身が出る
ハードリンク — ln
-sを付けずにln 実体 別名とすると、ハードリンクを作ります。シンボリックリンクが実体へのパスを格納した特殊なファイルなのに対し、ハードリンクは同じ実体(データ本体)を指すもう 1 つの名前です。どちらの名前から開いても中身は同一で、ls -lではハードリンクは矢印を出さず、通常のファイルと同じ表示になります。シンボリックは実体のパスを格納した特殊ファイル、ハードは同じ実体への別名、と区別します。
ln -sは実体へのパスを格納したsymを作り、lnは同じデータ本体を指す別名hardを作ります。catで出る中身はどちらもsharedですが、symはパスをたどって読み、hardは実体を直接読む点が違います。printf 'shared\n' > base.txt # 実体ファイルを作成
ln base.txt hard.txt # ハードリンクを作る
ls -l # hard.txt は矢印なしで並ぶ
cat hard.txt # base.txt と同じ中身が出る
リンク先を削除したときの挙動差
シンボリックリンクは実体へのパスを格納した特殊なファイルなので、実体が消えるとたどり先を失います。ハードリンクは同じ実体(データ本体)を指すもう 1 つの名前なので、元の名前が消えても中身は残ります。実体を削除して、両者の違いを実際に確かめます。
orig.txtをrmで消すと、パスを格納するだけのsl.txtは参照切れになり、データ本体を共有するhl.txtは中身が残ってcatできます。printf 'v\n' > orig.txt # 実体ファイルを作成
ln -s orig.txt sl.txt # シンボリックリンク
ln orig.txt hl.txt # ハードリンク
rm orig.txt # 実体を削除
cat sl.txt # たどり先を失い失敗する
cat hl.txt # 中身は残っていて表示できる
理解度チェック
まずは1問ずつ答えてみましょう。
Q2シンボリックリンクとハードリンクの違いとして正しいものはどれですか?
Q3実体ファイルをrmで削除した後、catが成功するのはどちらですか?