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