Мені цікаво, якщо компакт-диск сам посилає мене до своєї домашньої папки, а cd ~ робить те ж саме, чому тоді додано ~ в першу чергу?
Це щось специфічне для BASH чи вони б поводилися інакше в іншій оболонці?
Мені цікаво, якщо компакт-диск сам посилає мене до своєї домашньої папки, а cd ~ робить те ж саме, чому тоді додано ~ в першу чергу?
Це щось специфічне для BASH чи вони б поводилися інакше в іншій оболонці?
Відповіді:
~Може бути використаний для більш ніж просто. Будь-яка команда може отримати прибуток від наявності ярлика до домашньої папки. Так що це не обов'язково, якщо ви хочете записатись у свій будинок, а як бути ~/.config?
$ cd ~/.config
В іншому випадку вам доведеться виписати домашній шлях, використовувати $HOMEvar або зробити два cds. Також для копіювання або переміщення файлів:
$ cp ~/downloads/some-file some/path/
Оскільки більшість ваших файлів є вдома, завжди добре мати ярлик.
~є те, cd ~user/downloadщоб перейти до каталогу завантажень користувача.
Це cd в основному викликає cdвідсутність аргументів і відповідно до cdповедінки "... якщо dir не надається, значенням змінної оболонки HOME є за замовчуванням". (з посібника з bash ). Навпаки, cd ~це коли ви подаєте аргумент cdкоманді, що буває, ~і оболонка буде виконувати розширення tilde . Що стосується повернення до домашнього каталогу користувача - різниці немає. У будь-якому випадку HOMEзмінна середовища буде запитуватися:
$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'
/usr
/usr
Ефективно, це також не має різниці від cd $HOME. Однак, хоча cdбуде зроблено одне і єдине, tilde можна використовувати для виконання інших розширень, таких як ~+для поточного робочого каталогу.
Однак, що цікаво, ми можемо unset HOMEзламати, cdале ~все одно буде працювати:
$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'
bash: line 0: cd: HOME not set
/usr
/home/xieerqi
Чому? Знову відповідь у посібнику:
Якщо HOME не встановлено, замість цього заміняється домашня директорія користувача, що виконує оболонку. В іншому випадку префікс тильди замінюється на домашній каталог, пов'язаний із вказаним іменем входу.
Зауважте, що невстановлення відрізняється від створення порожньої змінної HOME=та має ефект. Документація конкретно говорить про невстановлення змінної. Зміна змінної дорівнює порожній рядку має ефект, протилежний тому, що ми очікували:
bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr
Тут ви можете бачити, що створення HOMEпорожніх рядків розриває як нахил, так і cdповедінку.
Тільде і $HOMEмають певну різницю та різні причини існування. $HOME- це змінна оболонка, яка також одночасно є однією із змінних оточуючих середовищ - і це доступно для всіх програм; в C ви б використовували environ()для доступу до цього. Навпаки, tildeце специфічний для оболонки синтаксис, який виконує розширення тильди, хоча wordexp()функцію можна використовувати і для виконання розширення ( посилання ) оболонки на C.
Причина, по якій ~представлений HOME, відповіла в цьому запитанні : колись символ тильди ділився тим самим ключем HOMEна терміналі ADM-3A Lear-Siegler. HOMEнавпаки, це змінна середовище, яка мала суто символічне значення і не має фізичних уявлень.
Крім того, той факт, що HOMEє змінною середовища, дозволяє нам її знеструмити, коли ми не можемо встановити ~щось інше простими засобами.
# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'
/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'
/home/xieerqi
Помітьте порожній рядок, де спочатку echoвиводиться незмінена змінна, і факт, що Навпаки, ми не можемо робити такі речі, щоб нахилитися:
$ bash -c '~=; cd ~;pwd'
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi
Однак зміна HOMEвпливає на ~:
$ env 'HOME=' bash -c 'echo $HOME; stat ~;'
stat: cannot stat '': No such file or directory
Крім того, оскільки ~також працює як характер розширення, ми можемо робити такі речі, щоб показати поточний робочий каталог:
$ bash -c 'cd /etc/;stat -c "%n" ~+'
/etc
Тоді як, якщо ми хочемо це зробити за допомогою змінних оточення, нам це потрібно PWDі HOMEзалишається тим самим, або якщо ви робите подібні речі echo $HOME+- це просто об'єднання рядків / змінних. Але знову ж таки, ~+виймає інформацію із змінних середовища:
$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'
/usr
ПРИМІТКА : ~+і ~-розширення працюють ksh, але не в dash.
Щоб відповісти на деякі конкретні питання:
Це щось специфічне для BASH чи вони б поводилися інакше в іншій оболонці?
Ні, це має бути послідовна поведінка. ksh, dashІ csh- все поводяться так само з cdабо cd ~.
чому тоді було додано ~ в першу чергу?
Я б сказав, зручність та історичні причини, як це пояснено у пов'язаній відповіді про тильду. Врешті-решт вона зросла більш ніж просто розширенням домашнього каталогу.
Незалежно від того, чи є ви кілька рівнів папок вище або нижче $HOME, команди cdі cd ~зробити те ж саме і не відрізняються - він пошле вас назад в свій домашній каталог.
ТАКОЖ: Коли ви на 1 або більше рівнях папок вище HOME і хочете перейти Прямо до підкаталогу 1 або більше рівнів папок нижче $HOME, tilde ( ~) стане в нагоді, заощаджуючи ваші натискання клавіш під час заміни тексту, необхідного для посилання до $HOMEпід час введення cdкоманди. Наприклад;
/$ cd # (or cd ~)
~$ pwd
/home/foo
~$ dir
bar bar2 bar3
~$ cd ..
/$ cd ..
/$ pwd
/
/$ cd /bar3
bash: cd: /bar3: no such file or directory
/$ cd ~/bar3 # (instead of "cd /home/foo/bar3")
~/bar3$ pwd
/home/foo/bar3
~ означає / home / username (ім’я користувача), тому ви заощаджуєте деякий час під час введення тексту. Наприклад, cd / home / username / Downloads те саме, що cd ~ / Downloads, але менше вводити текст. Обидві команди роблять те ж саме, змінюють робочий каталог на те місце.
rootдомашній каталог «S, як правило , за межами/home
cd ~протиcd $HOMEпротиcd ~not-tandu. Це питання питає проcdпротиcd ~.