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