Penyelesaian Bash tak terduga pada ~ pada OS X

13

Saya menekan ~TabTabprompt perintah bash dan mendapatkan serangkaian penyelesaian yang tidak terduga.

Pertama terlihat seperti semua orang di /Usersdirektori, dan banyak lagi.

Kemudian saya pikir itu melakukan pencarian terbalik orang-orang dengan direktori "home" di /etc/password, atau mungkin orang-orang yang /var/empty- ini sepertinya benar.

Yang membuat saya penasaran adalah apa yang sebenarnya terjadi dan mengapa ini berfungsi sebagaimana mestinya.

Walt Stoneburner
sumber

Jawaban:

21

Saya tidak memiliki sistem OSX yang berguna untuk memeriksa tetapi pada semua * nixes, ~fooadalah singkatan untuk direktori home pengguna foo. Misalnya, perintah ini akan pindah ke pengguna saya $HOME( cd ~sendirian akan pindah ke direktori home Anda):

cd ~terdon

Jadi, ~dan Tabakan diperluas ke semua kemungkinan nama pengguna. Daftar harus sama dengan daftar pengguna di /etc/passwd.

Saya dapat mengkonfirmasi bahwa itulah yang terjadi ketika saya mencoba ini pada Debian saya.

terdon
sumber
Itu sama ketika saya mencobanya di FreeBSD.
Jenny D
Jadi hal yang melemparkan saya adalah bahwa saya tidak memiliki direktori di / rumah untuk para pengguna. Bahkan, banyak yang mengatakan / var / kosong. Saya pikir penyelesaian seperti itu dilakukan oleh pencarian disk, sehingga ~ akan melihat direktori home sebenarnya pada disk daripada entri / etc / passwd. Karena ~ benar-benar berarti "direktori home pengguna" dan sebenarnya bukan jalan pintas untuk / home (atau / Pengguna), referensi ekspansi / var / kosong dalam case OS X saya. Belajar sesuatu yang baru! Terima kasih!
Walt Stoneburner
@WaltStoneburner fdo jawaban di bawah ini menunjukkan bahwa OSX melakukan sesuatu yang berbeda, saya tidak tahu. Di Linux, bagaimanapun, membuat direktori di /hometidak relevan, itu tidak akan membuat nama pengguna baru dicantumkan. Juga, perhatikan bahwa tidak semua $ HOME pengguna berada di /home(atau /Users).
terdon
@terdon - Saya pikir Anda berhasil dengan jawaban Anda. Pada akun Linux saya, saya memiliki pengguna dovenull yang memiliki direktori palsu / tidak ada, muncul di pelengkapan otomatis, tetapi perintah cd gagal (seperti yang diharapkan).
Walt Stoneburner
2

Saya pikir itu melakukan pencarian terbalik orang-orang dengan direktori "home" di / etc / password.

Pada OS X Open Directory dikonsultasikan alih-alih / etc / passwd.

fd0
sumber
1

Manual Referensi Bash mengatakan :

Bash mencoba menyelesaikan memperlakukan teks sebagai nama pengguna (jika teks dimulai dengan '~')

Bash menggunakan getpwent fungsi untuk penyelesaian.

man getpwent di OSX mengatakan:

Fungsi-fungsi ini memperoleh informasi dari opendirectoryd (8), termasuk catatan di /etc/master.passwd yang dijelaskan dalam master.passwd (5).

Evgeny Vereshchagin
sumber