Мені цікаво, якщо компакт-диск сам посилає мене до своєї домашньої папки, а cd ~ робить те ж саме, чому тоді додано ~ в першу чергу?
Це щось специфічне для BASH чи вони б поводилися інакше в іншій оболонці?
Мені цікаво, якщо компакт-диск сам посилає мене до своєї домашньої папки, а cd ~ робить те ж саме, чому тоді додано ~ в першу чергу?
Це щось специфічне для BASH чи вони б поводилися інакше в іншій оболонці?
Відповіді:
~
Може бути використаний для більш ніж просто. Будь-яка команда може отримати прибуток від наявності ярлика до домашньої папки. Так що це не обов'язково, якщо ви хочете записатись у свій будинок, а як бути ~/.config
?
$ cd ~/.config
В іншому випадку вам доведеться виписати домашній шлях, використовувати $HOME
var або зробити два cd
s. Також для копіювання або переміщення файлів:
$ 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 ~
.