Неожиданное завершение Bash ~ на OS X

13

Я нажал ~TabTabна командную строку bash и получил неожиданный набор завершений.

Сначала это выглядело как все люди в /Usersкаталоге, и многое другое.

Затем я подумал, что это был обратный поиск людей с «домашними» каталогами /etc/passwordили, возможно, теми, которые были /var/empty- это кажется правильным.

Что мне интересно, так это то, что на самом деле происходит и почему это работает так, как есть.

Уолт Стоунбернер
источник

Ответы:

21

У меня нет удобной системы OSX для проверки, но на всех * nixes ~fooэто сокращение для домашнего каталога пользователя foo. Например, эта команда переместится в моего пользователя $HOME( cd ~одна переместится в вашу домашнюю директорию):

cd ~terdon

Итак, ~и Tabрасширим все возможные имена пользователей. Список должен совпадать со списком пользователей в /etc/passwd.

Я могу подтвердить, что это именно то, что происходит, когда я пытаюсь сделать это на своем Debian.

Тердон
источник
То же самое, когда я пробую это на FreeBSD.
Дженни Д,
Поэтому меня бросило в глаза то, что у меня не было каталогов в / home для этих пользователей. На самом деле многие говорили / var / empty. Я подумал, что такие дополнения были выполнены с помощью поиска на диске, так что ~ будет искать реальный домашний каталог на диске, а не записи / etc / passwd. Поскольку ~ действительно означает «домашний каталог пользователя», а не ярлык для / home (или / User), расширение ссылается на / var / empty в моем случае с OS X. Узнал что-то новое! Благодарность!
Уолт Стоунбернер
Ответ @WaltStoneburner fdo ниже предполагает, что OSX делает что-то другое, я не знаю. В любом случае, в Linux создание каталога в не /homeимеет никакого значения, поскольку в нем не будет указано новое имя пользователя. Также обратите внимание, что не все пользовательские $ HOME находятся в /home(или /Users).
Тердон
@terdon - Я думаю, ты прибил это своим ответом. В моей учетной записи Linux у меня есть пользователь dovenull, у которого есть фиктивный каталог / nonexisting, он отображается в автозаполнении, но команда cd не выполняется (как и ожидалось).
Уолт Стоунбернер
2

Я думал, что это делает обратный поиск людей с "домашними" каталогами в / etc / password.

В OS X открыт каталог, а не / etc / passwd.

fd0
источник
1

Справочное руководство Bash гласит :

Bash пытается завершить обработку текста как имени пользователя (если текст начинается с '~')

Bash использует getpwent функцию для завершения.

man getpwent на OSX говорит:

Эти функции получают информацию из opendirectoryd (8), включая записи в /etc/master.passwd, который описан в master.passwd (5).

Евгений Верещагин
источник