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

14

CD ~

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

cd $HOME

что так же, как

cd /home/tandu

Тем не мение,

cd ~not-tandu

изменения в /home/not-tandu

Это чисто синтаксический выбор? Как это обрабатывается ядром (или cdисполняемым файлом?). Существует ли особый случай для ~добавления косой черты, если все остальное опущено? То есть ~/и ~перейдите в тот же каталог, но ~aна один каталог вверх. То же самое нельзя сказать о любом другом каталоге, на который вы меняете.

Таблетки взрыва
источник
3
Не стесняйтесь сравнивать ~ not-tandu и ~ / not-tandu, один указывает на пользователя not-tandu home dir, а другой указывает на dir not-tandu в вашем homedir.
Йохан
4
Это не ядро ​​или "исполняемый файл cd" (поскольку такого нет) - это встроенная оболочка.
Пол Томблин
Так как вы не упоминаете это: cdбез каких-либо параметров работает, как cd ~. Если заменить cdс echoвы можете увидеть на то , что выражение расширяется оболочкой.
Джофель

Ответы:

18

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

penguin359
источник
re "который затем пытается посмотреть файл с именем ~ в корневом каталоге"; Это для всех вкусов Unix?
Пейсер
17

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

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

Патрик
источник
1
Чем конкретно занимается эта замена и каким алгоритмом? Это cdили оболочка? Что делать, если вы не используете оболочку? Это простое «если за чем-то следуют, расширяются по-другому?» или есть какое-то другое специальное обращение для этого уникального условия?
Взрыв таблетки
8
Смотрите руководство Bash по расширению Tilde . (Многие другие оболочки и программы следуют аналогичным правилам.)
cjm
4
@tandu: оболочка делает cd, нет внешнего исполняемого файла, чтобы сделать это (это было бы невозможно)
Mat
1
@tandu: если вы не запускаете оболочку (например, пробуете ее с помощью exec(2)), расширение оболочки не происходит. Без расширения оболочки ~ничего не заменяется - это просто еще один совершенно правильный символ. Это укусило меня в мои первые дни в SunOS, потому /bin/shчто я не грохнул ~.
Алексиос
5

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

Игнасио Васкес-Абрамс
источник