`ls -a` はなぜ `.` や `..` を表示するんでしょう？


Unix / Linux の世界で、ファイルシステム上の全てのディレクトリ上に `.` と `..`
はわざわざ確認しなくても「概念上」存在するものだと思っています。どこのディレクトリに `cd` しても存在することがわかりきっているのに `ls -a` が
`.` や `..` を表示するのはちょっと無駄なような気がしてきました。

なぜ `ls -a` は `.` と `..` を表示するんでしょうか？

関連質問  
[findコマンドで特定のディレクトリの全てのディレクトリを表示する方法](https://ja.stackoverflow.com/questions/41551/)




なぜ表示されるかと言えば **ハードリンクとして**
実際に`.`や`..`という名前でディレクトリが存在しているからのようです。「inode」を確認すると、ディレクトリ名で指定した場合と`.`とで必ず一致しています(`..`も同様)。

[code]

    # ls -id /root
    3112961 /root/
    # ls -id .
    3112961 ./
    
    # cd /tmp
    # ls -id /tmp
    1703937 /tmp/
    # ls -id .
    1703937 ./
    
[/code]

* * *

なお、`ln`コマンドでハードリンクを作ろうとしても、ユーザがコマンドで実行した場合はディレクトリに対しての作成は禁止されていますし、スーパーユーザー権限向けのオプションが存在しますがこちらも実際に試すとエラーになります(セキュリティ上の理由？)。

>
[code]

>        -d, -F, --directory
>               スーパーユーザーがディレクトリへのハードリンクを作成するのを許す。
>  
[/code]

ディレクトリ作成時、コールバック経由で`.`や`..`のハードリンクが作成されているようです。  
(下記リンク先はext2での説明)

参考：  
[親ディレクトリ/カレントディレクトリ - Linuxの備忘録](http://wiki.bit-
hive.com/north/pg/%BF%C6%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8%A5%EA%2F%A5%AB%A5%EC%A5%F3%A5%C8%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8%A5%EA)

