Значение тильды в Linux bash (не домашний каталог)

106

Во-первых, я знаю, что ~/это домашний каталог. Компакт-диск ~или ~/переносит меня в домашний каталог.

Однако cd ~Xпереносит меня в особое место, где Xвроде бы что угодно.

В bash, если я нажимаю " cd ~" и нажимаю вкладку, появляется множество возможных ~Xвариантов, таких как ~mailи ~postgresи ~ssh. Переход к этим папкам и выполнение операций pwdпоказывает мне, что этих папок нет в домашнем каталоге; они повсюду.

Это не псевдонимы. Я проверил. Они не являются env.переменными, иначе они потребовали бы $.

Что устанавливает эти ссылки и где я могу найти, где они устанавливаются?

jbu
источник
~ X просто возвращает литерал "~ X", но ~ возвращает $ HOME, а ~ + возвращает $ PWD - они не являются специальными, за исключением того, что они выбирают переменные оболочки. т.е. они не хранят значения и не выполняют команду для их поиска. Они уже определены. Вы пробовали ~ -? Я не могу придумать, как ему использовать, но опять же, он возвращает переменную оболочки $ OLDPWD
SDsolar

Ответы:

71

Это функция Bash, которая называется « тильда». ». Это функция оболочки, а не ОС. Например, вы получите другое поведение с csh.

Чтобы ответить на ваш вопрос о том, откуда берется информация: ваш домашний каталог берется из переменной $HOME(независимо от того, что вы там храните), в то время как дома других пользователей извлекаются в реальном времени с использованием getpwent(). Эта функция обычно контролируется NSS ; поэтому по умолчанию значения извлекаются /etc/passwd, хотя его можно настроить для получения информации из любого желаемого источника, такого как NIS, LDAP или база данных SQL.

Расширение тильды - это больше, чем поиск в домашнем каталоге. Вот краткое изложение:

~              $HOME
~fred          (freds home dir)

~+             $PWD       (your current working directory)
~-             $OLDPWD    (your previous directory)
~1             `dirs +1`
~2             `dirs +2`
~-1            `dirs -1`

dirsи ~1, ~-1и т.д., используются вместе с pushdи popd.

Тайлерл
источник
в качестве заметки рыба не поддерживает ни один из них, кроме простой тильды (~)
зачем они придумали ~+? кажется бесполезным.
cregox
3
~ + примерно то же самое, что. Однако, чтобы использовать что-то вроде ./file, он должен перейти в файловую систему и выяснить, где. находится - проходит несколько циклов. Использование ~ + сохраняет его работу, просто возвращая содержимое переменной оболочки $ PWD, которая уже определена при просмотре файловой системы.
SDsolar
32

Это домашние каталоги пользователей. Попробуйте cd ~(your username), например.

Ана Беттс
источник
1
Это не символические ссылки, у служебных учетных записей нет домашних каталогов в / home
Ана Беттс,
Лучший ответ в моем случае. Кроме того, в моем конкретном случае это был корневой каталог / папка, а не домашняя папка.
wlwl2
16

Это домашние каталоги пользователей /etc/passwd? Такие службы, как postgres, sendmail, apache и т. Д., Создают пользователей системы, у которых есть домашние каталоги, как и у обычных пользователей.

Шон Брайт
источник
2
На самом деле это ~ имя пользователя - это домашний каталог указанного пользователя
Стив Уит,
14

Это пользователи. Проверьте свой /etc/passwd.

cd ~username перенесет вас в домашний каталог этого пользователя.

Йоаким Элофссон
источник
FTW. Голосовать за. TNX за прояснение этого вопроса. Интересно, сколько циклов и, возможно, даже подоболочки задействовано в этом. Только представьте, если в вашей системе 3К пользователей, как у небольшого интернет-провайдера. Ой.
SDsolar
9

На моей машине, из-за того, как я все настроил, делаю:

cd ~             # /work1/jleffler
cd ~jleffler     # /u/jleffler

Первый обращает внимание на значение переменной окружения $HOME; Я намеренно установил $HOMEлокальную файловую систему, а не файловую систему, смонтированную по NFS. Второй читает из файла паролей (примерно; NIS немного усложняет ситуацию) и обнаруживает, что в файле паролей указано, что мой домашний каталог находится, /u/jlefflerи переходит в этот каталог.

Раздражает то, что большая часть программного обеспечения ведет себя так, как указано выше (и спецификация POSIX для оболочки требует такого поведения). Я использую некоторое программное обеспечение (и у меня нет особого выбора), которое обрабатывает информацию из файла паролей как текущее значение $ HOME, что неверно.

Применяя это к вопросу - как указывали другие, ' cd ~x' переходит в домашний каталог пользователя 'x' и, в более общем смысле, всякий раз, когда выполняется расширение тильды, ~xозначает домашний каталог пользователя 'x' (и это ошибка если пользователь 'x' не существует).


Возможно, стоит упомянуть следующее:

cd ~-       # Change to previous directory ($OLDPWD)
cd ~+       # Change to current directory ($PWD)

Я не могу сразу найти применение для ' ~+', если только вы не сделаете какие-то странные вещи с перемещением символических ссылок по пути, ведущему к текущему каталогу.

Вы также можете:

cd -

Это означает то же, что и ~-.

Джонатан Леффлер
источник
1
О cd ~+: вы потенциально можете использовать его, чтобы проверить, существует ли каталог, в котором вы сейчас находитесь, даже если это довольно неортодоксальный способ сделать это.
ProfessorSloth
1

Если вы используете, autofsто расширение может быть получено /etc/auto.home(или похоже на ваш дистрибутив). Например, мой /etc/auto.masterвыглядит так:

/home2 auto.home --timeout 60

и /etc/auto.home выглядит так:

mgalgs -rw,noquota,intr space:/space/mgalgs
мгалгс
источник
0

Возможно, вы видите, что пользователи OpenDirectory / ActiveDirectory / LDAP "автоматически монтируются" в ваш домашний каталог.

В * nix ~разрешается в ваш домашний каталог. Таким же образом ~Xразрешится «пользователь X».

Подобно автоматическому монтированию каталогов, OpenDirectory / ActiveDirectory / LDAP используется в более крупных / корпоративных средах для автоматического монтирования пользовательских каталогов. Эти пользователи могут быть реальными людьми или могут быть учетными записями компьютеров, созданными для предоставления различных функций.

Если вы введете, ~Tabвы увидите список пользователей на вашем компьютере.

JS.
источник