OS X Yosemiteでは、次のコマンドを使用すると、次のようになります。
$ touch .a
$ touch b
$ /bin/ls
b
$ /bin/ls -A
.a b
$ Sudo /bin/ls
.a b
Rootで起動したときには隠しファイル(ドットで始まる名前)が表示され、通常のユーザーとして実行しているときには(期待どおりに)表示されません。これはLinux上のls
(coreutils
から来るもの)が行うこととは異なります。
なぜls
はこのように振る舞うのですか?
この機能はApple固有のものではないことがわかりました。これは、一般的なBSDシステムの機能です。
/* Root is -A automatically. */
if (!getuid())
f_listdot = 1;
最初は、 4.4BSD-Lite のソースまでさかのぼることができました。それはすでに このFreeBSDコミット にあり、1994年からこれらのソースをインポートしています。
この機能はOpenBSDにも存在し、NetBSDからコードをインポートしていると主張する1995年の this commit にあります。したがって、これは NetBSD にすでに存在していました。
それから、1993年からNetBSDが 86BSD からコードをインポートしていると主張するコミットを発見し、その機能はすでに there です。さらに、 このコミット は、1991年の386BSDバージョン0.0の開発中に存在したことを示しています。
このコメントは、「 4.3BSD-Reno in this commit (1989年6月27日)」の開発中に「新しいlsの最初の作業バージョン」というタイトルで初めて登場しました。元のコメントは言った:
/* root sees all files automatically */
その日以降に変更された (ただし、このリポジトリのタイムスタンプが完全に正しいかどうかはわかりません)
/* root is -A automatically */
そして、1992年にのみ大文字と期間 追加されました コメントを現在のものに変えました:
/* Root is -A automatically. */
しかし、 このスナップショット :
Aflg = getuid() == 0;
当時の実際の履歴は見つかりませんが、1977年以降の1BSDの このスナップショットwithoutの行もあります。そして、実際に-A
フラグなし。
そのため、この機能は1977年11月(その時点で1BSDが開発中)から1979年5月に2BSDがリリースされた間に導入されたようです。
私がこの調査で見つけたのは、-I
フラグです。これは、2005年にFreeBSDに 追加された で、この動作を無効にし、少し後で reworked でした。
これが ソースコードへのリンク です。 /* Root is -A automatically. */
に注意してください。これはAppleのBSD ls
のバージョンの機能です。
IIRC、Usenetの初期の頃(80年代初頭)にこの件についてのスレッドがありました。悪意のあるユーザーがsysadmin/rootからファイル/ディレクトリ/実行可能ファイルを簡単に隠すことができないように、この機能はセキュリティ対策として追加されました。理論は基本的に「rootはすべてにアクセスできるので、すべてを見ることができるはずです」でした。