~ є $ HOME, але іноді?


14

cd ~

робить те саме, що і

cd $HOME

що також те саме, що

cd /home/tandu

Однак,

cd ~not-tandu

зміни до /home/not-tandu

Це суто синтаксичний вибір? Як це обробляється ядром (або виконуваним cdфайлом?) Чи є окремий випадок для ~додавання косої риси, якщо все інше пропущено? Тобто, ~/і ~змінити в той же каталог, але ~aвгору один каталог. Те саме не можна сказати для будь-якого іншого каталогу, який ви змінюєте.


3
Не соромтеся порівнювати ~ not-tandu та ~ / not-tandu, один вказує на домашній dir користувач not-tandu, а інший вказує на dir not-tandu у вашому homedir.
Йохан

4
Це не ядро ​​або "виконуваний компакт-диск" (оскільки такого немає) - це вбудована оболонка.
Пол Томблін

Так як ви це не згадуєте: cdбез будь-яких параметрів працює як cd ~. Якщо замінити cdз echoви можете побачити на те , що вираз розширюється оболонкою.
jofel

Відповіді:


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.


re ", який потім намагається переглянути файл з назвою ~ в кореневій директорії"; Це для всіх ароматів Unix?
Pacerier

17

~foo означає "домашній каталог foo користувача".

Це не робиться ядром, воно інтерпретується оболонкою. Щоразу, коли оболонка розглядається ~fooяк аргумент, вона прозоро замінює її домашньою каталогом користувача fooта передає її на своє місце. Отже, коли ви запускаєте cd ~tandu, оболонка насправді працює cd /home/tandu.


1
Що конкретно робить ця заміна та за допомогою якого алгоритму? Це cdчи оболонка? Що робити, якщо ви не запустите оболонку? Це просте "якщо за ~ до чогось слідує, розшириться інакше?" чи є якісь інші спеціальні поводження для цього унікального стану?
Вибухові таблетки

8
Дивіться посібник Bash про розширення Tilde . (Багато інших оболонок і програм відповідають подібним правилам.)
cjm

4
@tandu: оболонка робить cd, для цього немає зовнішньої версії (це було б неможливо)
Март

1
@tandu: якщо ви не запускаєте оболонку (наприклад, випробуйте це за допомогою exec(2)), розширення оболонки не відбувається. Без розширення оболонки ~нічого не замінить - це просто ще один ідеально дійсний персонаж. Це мене /bin/shпокусало в моїх ранніх днях SunOS, тому що не вівся ~.
Олексій

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.