~ это $HOME, но иногда?

~ это $HOME, но иногда?

компакт-диск ~

делает то же самое, что и

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на самом деле является встроенной командой. Это специальная директива, которая сообщает самой оболочке о необходимости смены каталогов. Это не похоже на другие встроенные команды оболочки, которые можно реализовать как отдельный исполняемый файл, например echois , потому что она используется для изменения фундаментального атрибута процесса оболочки. echoэто всего лишь оболочка, встроенная из соображений производительности, но в старые добрые времена UNIX была доступна только в виде собственного исполняемого файла /bin/echo.

решение2

~fooозначает «домашний каталог пользователя foo».

Это не делается ядром, это интерпретируется оболочкой. Всякий раз, когда оболочка видит ~fooаргумент, она прозрачно заменяет его на домашний каталог пользователя fooи передает его вместо него. Так что когда вы запускаете cd ~tandu, оболочка фактически запускает cd /home/tandu.

решение3

~за которым следует имя пользователя, расширяется до домашнего каталога этого пользователя.

Связанный контент