Bash bất ngờ hoàn thành ~ trên OS X


13

Tôi nhấn ~TabTabvào dấu nhắc lệnh bash và nhận được một bộ hoàn thành bất ngờ.

Đầu tiên, nó trông giống như tất cả những người trong /Usersthư mục, và nhiều hơn nữa.

Sau đó, tôi nghĩ rằng nó đang thực hiện tra cứu ngược lại những người có thư mục "nhà" /etc/password, hoặc có lẽ là những người /var/empty- điều này có vẻ đúng.

Điều tôi tò mò là những gì đang thực sự diễn ra và tại sao điều này lại hoạt động như vậy.

Câu trả lời:


21

Tôi không có hệ thống OSX tiện dụng để kiểm tra nhưng trên tất cả * nixes, ~foolà một cách viết tắt cho thư mục chính của người dùng foo. Ví dụ: lệnh này sẽ di chuyển vào người dùng của tôi $HOME( cd ~một mình sẽ chuyển vào thư mục chính của bạn):

cd ~terdon

Vì vậy, ~Tabsẽ mở rộng cho tất cả các tên người dùng có thể. Danh sách nên giống như danh sách người dùng trong /etc/passwd.

Tôi có thể xác nhận rằng đó chính xác là những gì xảy ra khi tôi thử điều này trên Debian.


Nó giống nhau khi tôi thử nó trên FreeBSD.
Jenny D

Vì vậy, điều khiến tôi thất vọng là tôi không có thư mục trong / nhà cho những người dùng đó. Trong thực tế, nhiều người nói / var / trống. Tôi hình dung rằng các lần hoàn thành như vậy là bằng cách tra cứu đĩa, do đó ~ sẽ xem xét thư mục chính thực tế trên đĩa thay vì các mục / etc / passwd. Bởi vì ~ thực sự có nghĩa là "thư mục nhà của người dùng" và không thực sự là một phím tắt cho / home (hoặc / Người dùng), các tham chiếu mở rộng / var / trống trong trường hợp OS X của tôi. Đã học được điều gì đó mới! Cảm ơn!
Walt Stoneburner

Câu trả lời của @WaltStoneburner dưới đây cho thấy OSX đang làm điều gì đó khác biệt, tôi không biết. Trên Linux, dù sao đi nữa, việc tạo một thư mục trong /homelà không liên quan, điều đó sẽ không làm cho một tên người dùng mới được liệt kê. Ngoài ra, lưu ý rằng không phải tất cả $ HOME của người dùng đều ở /home(hoặc /Users).
terdon

@terdon - Tôi nghĩ bạn đóng đinh nó với câu trả lời của bạn. Trên tài khoản Linux của tôi, tôi có một người dùng dovenull có thư mục không có thật là / nonexistent, nó hiển thị trong tự động hoàn thành, nhưng lệnh cd không thành công (như mong đợi).
Walt Stoneburner

2

Tôi nghĩ rằng nó đang thực hiện tra cứu ngược lại mọi người với các thư mục "home" trong / etc / password.

Trên OS X Open Directory được tư vấn thay vì / etc / passwd.


1

Tài liệu tham khảo Bash nói :

Bash cố gắng hoàn thành coi văn bản là tên người dùng (nếu văn bản bắt đầu bằng '~')

Bash sử dụng getpwent chức năng để hoàn thành.

man getpwent trên OSX nói:

Các hàm này có được thông tin từ opendirectoryd (8), bao gồm các bản ghi trong /etc/master.passwd được mô tả trong master.passwd (5).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.