Linuxとコマンドラインの基礎
$ echo hello > a.txt
$ ln a.txt h.txt
$ ln -s a.txt s.txt
$ rm a.txt
$ cat h.txt
$ cat s.txt上のコマンドを順に実行したとき、最後の2つの cat の結果として、正しいものはどれか。
- Ah.txt も s.txt も hello を表示する
- Bh.txt はファイルが見つからないというエラーになり、s.txt は hello を表示する
- Ch.txt は hello を表示し、s.txt はファイルが見つからないというエラーになる
答えと解説を見る
正解:C. h.txt は hello を表示し、s.txt はファイルが見つからないというエラーになる
ln で作るハードリンクは、元のファイルと同じ inode(ファイルの中身と属性を管理する番号付きの情報)を指す、もう1つの名前です。rm a.txt で消えるのは a.txt という名前だけで、h.txt という名前が残っているので中身は消えず、cat h.txt は hello を表示します。ln -s で作るシンボリックリンクは「a.txt」というパスを中身として持つ別のファイルなので、a.txt が消えるとたどる先がなくなり、cat s.txt は「No such file or directory」のエラーになります。このように、たどる先がなくなったシンボリックリンクは、リンク切れの状態でそのまま残ります。
- A. シンボリックリンクはパスをたどってファイルを開くので、a.txt が消えると s.txt からは読めません。
- B. ハードリンクとシンボリックリンクの性質が逆です。名前が1つでも残っていれば、ハードリンクから中身を読めます。
- C. 正しい。ハードリンクは同じ inode を指す名前なので残り、シンボリックリンクはリンク切れになります。