OS Xでの〜の予期しないBash完了


13

~TabTabbashコマンドプロンプトを押すと、予期しない一連の完了が表示されました。

最初は、/Usersディレクトリ内のすべての人々のように見えました。

それから、「ホーム」ディレクトリを持つ人々/etc/password、またはおそらく存在する人々の逆ルックアップを行っていると思いました/var/empty-これはほぼ正しいようです。

私が興味を持っているのは、実際に何起こっているのなぜこれが機能するのかということです。

回答:


21

チェックするのに便利なOSXシステムはありませんが、すべての* nixesで、~foouserのホームディレクトリの省略形ですfoo。たとえば、このコマンドはユーザーのディレクトリに移動します$HOMEcd ~単独でホームディレクトリに移動します)。

cd ~terdon

だから、~およびTabすべての可能なユーザ名に展開されます。リストは、のユーザーのリストと同じである必要があります/etc/passwd

Debianでこれを試してみると、まさにそれが起こることを確認できます。


FreeBSDで試しても同じです。
ジェニーD

だから私を投げたのは、それらのユーザーのディレクトリが/ homeにないということです。実際、多くの人が/ var / emptyと言いました。このような完了はディスク検索によるものであると考えたため、〜は/ etc / passwdエントリではなく、ディスク上の実際のホームディレクトリを参照ます。〜は実際には「ユーザーのホームディレクトリ」を意味し、実際には/ home(または/ User)のショートカットではないため、OS Xの場合、展開は/ var / emptyを参照します。何か新しいことを学んだ!ありがとう!
ウォルトストーンバーナー

以下の@WaltStoneburner fdoの回答は、OSXが何か別のことをしていることを示唆しています。とにかく、Linuxでディレクトリを作成すること/homeは無関係であり、新しいユーザー名がリストされることはありません。また、すべてのユーザーの$ HOMEが/home(または/Users)にあるわけではないことに注意してください。
テルドン

@terdon-あなたはあなたの答えでそれを釘付けにしたと思います。私のLinuxアカウントには、/ nonexistentの偽のディレクトリを持つdovenullユーザーがあり、オートコンプリートに表示されますが、cdコマンドは失敗します(予想どおり)。
ウォルトストーンバーナー

2

/ etc / passwordにある「home」ディレクトリを使用して、人々の逆引きを行っていると思いました。

OS Xでは、/ etc / passwdではなくOpen Directoryが参照されます。


1

Bashリファレンスマニュアルによると

Bashはテキストをユーザー名として処理を完了しようとします(テキストが「〜」で始まる場合)

Bash getpwent完了のために関数を使用します。

man getpwent OSXで言う:

これらの関数は、master.passwd(5)で説明されている/etc/master.passwdのレコードを含む、opendirectoryd(8)から情報を取得します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.