
компакт-диск ~
делает то же самое, что и
cd $HOME
что также то же самое, что
cd /home/tandu
Однако,
cd ~not-tandu
изменения в/home/not-tandu
Это чисто синтаксический выбор? Как это обрабатывается ядром (или cd
исполняемым файлом?) Есть ли особый случай для ~
добавления слеша, если все остальное опущено? То есть, ~/
и ~
перейти в тот же каталог, но ~a
на один каталог выше. То же самое нельзя сказать о любом другом каталоге, в который вы переходите.
решение1
~
является псевдонимом для , $HOME
предоставляемым рядом оболочек, но $HOME
является более универсальным. $HOME
фактически просит оболочку вставить (подставить) здесь переменную окружения HOME. Существует довольно много различных переменных окружения, которые можно подставить, попробуйте выполнить env
для получения списка. Обратите внимание, что ~
не всегда распознается, если находится не в начале слова. Попробуйте эти две команды для сравнения:
ls /~
ls /$HOME
Первый передается исполняемому файлу ls как , /~
который затем пытается просмотреть файл, вызванный ~
в корневом каталоге, второй расширяется $HOME
и становится //home/user
, который затем передается исполняемому файлу ls как аргумент командной строки. Все системы POSIX (POSIX является стандартом для того, как работают системы UNIX и Linux) позволяют обрабатывать несколько слешей так же, как один слеш, поэтому //home/user
это то же самое, что сказать /home/user
. ~username
— это сокращение для указания оболочке искать имя пользователя в файле passwd и возвращать его домашний каталог. Эквивалентной переменной окружения нет. Все эти подстановки выполняются оболочкой и поддерживаются большинством из них, но только переменные окружения, такие как , $HOME
гарантированно поддерживаются всеми оболочками. Кроме того, cd
на самом деле является встроенной командой. Это специальная директива, которая сообщает самой оболочке о необходимости смены каталогов. Это не похоже на другие встроенные команды оболочки, которые можно реализовать как отдельный исполняемый файл, например echo
is , потому что она используется для изменения фундаментального атрибута процесса оболочки. echo
это всего лишь оболочка, встроенная из соображений производительности, но в старые добрые времена UNIX была доступна только в виде собственного исполняемого файла /bin/echo
.
решение2
~foo
означает «домашний каталог пользователя foo».
Это не делается ядром, это интерпретируется оболочкой. Всякий раз, когда оболочка видит ~foo
аргумент, она прозрачно заменяет его на домашний каталог пользователя foo
и передает его вместо него. Так что когда вы запускаете cd ~tandu
, оболочка фактически запускает cd /home/tandu
.
решение3
~
за которым следует имя пользователя, расширяется до домашнего каталога этого пользователя.