Изменить: Это дубликат /programming/998626/meaning-of-tilde-in-linux-bash-not-home-directory/ . У меня нет репутации, чтобы закрыть этот вопрос как дубликат.
Я не имею в виду ~
домашний каталог, а скорее это:
$ ls ~foo/bar
/some/mount/point/foo/bar
Однако, если я попытаюсь сделать это с другой точкой монтирования, например:
$ mount | ag "/dev "
devfs on /dev (devfs, local, nobrowse)
$ ls /dev/stdin
/dev/stdin
$ ls ~stdin
zsh: no such user or named directory: stdin .
# bash has a similar error message:
ls: ~stdin: No such file or directory
Как ~
называется в этом контексте? Как это работает?
Изменить: дополнительная информация на основе некоторых комментариев ниже:
- Я могу подтвердить, что
foo
это не имя пользователя в моей системе. - При попытке автозаполнения
ls -lah ~
отображаются не все параметры. т.е. я могуcd ~qux
, когдаqux
не появляется в автозаполнении. Опятьqux
не пользователь в моей системе. - Если это имеет значение
/some/mount/point
, это сетевой ресурс. - Все детали предполагают некоторую именованную траекторию, особенность оболочки Z для раскрытия пути, но это работает и в bash, которая, очевидно, не поддерживает такие вещи, как именованные пути оболочки Z.
/some/mount/point
определенно не мой домашний каталог. cd ~
берет меня на - /Users/$username/
какие матчи$HOME
zsh
также, кажется, использует тильду для обозначения именованных каталогов.
bash -c "ls ~foo/bar"
), которая не имеет именованных каталогов. Более того, даже в zsh, если я проверяю env
, я не вижу ни одного настроенного каталога. Я нахожусь на Mac OS, и я чувствую, что это какая-то особенность, характерная для OS X.
~foo
. Возьми реальную строку (не пример foo
) и сделай grep "actual username" /etc/passwd
. ~text
должен работать только для возможных имен пользователей для входа в систему в соответствии с руководством bash (не обязательно означает, что он действительно может войти в систему; в случае пользователей системы, таких как ~lp
, например). Во всех моих тестах это ~string
соответствует string
имени пользователя.
~foo
домашний каталог пользователяfoo
. Если пользователь не указан, по умолчанию используется текущий пользователь.