~это псевдоним для $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.