Різниця між 'cd' і 'cd ~'


10

Мені цікаво, якщо компакт-диск сам посилає мене до своєї домашньої папки, а cd ~ робить те ж саме, чому тоді додано ~ в першу чергу?

Це щось специфічне для BASH чи вони б поводилися інакше в іншій оболонці?


2
Однозначно не дублікат. Це питання питає про cd ~проти cd $HOMEпроти cd ~not-tandu. Це питання питає про cdпроти cd ~.

Відповіді:


17

~Може бути використаний для більш ніж просто. Будь-яка команда може отримати прибуток від наявності ярлика до домашньої папки. Так що це не обов'язково, якщо ви хочете записатись у свій будинок, а як бути ~/.config?

$ cd ~/.config

В іншому випадку вам доведеться виписати домашній шлях, використовувати $HOMEvar або зробити два cds. Також для копіювання або переміщення файлів:

$ cp ~/downloads/some-file some/path/

Оскільки більшість ваших файлів є вдома, завжди добре мати ярлик.


Привіт ахільсенде, насправді моє питання більш орієнтоване на те, чому два способи. Я вже знаю про ~ використання змінної $ HOME, але, маючи на увазі, чому сам "CD" також відправляє мене додому. Чому 2 способи з тією ж метою?
Луїс Альварадо

4
@CYREX Моя здогадка - це зберегти введення тексту для найчастішого випадку, коли потрібно перейти до вашого домашнього каталогу.
CVn

1
Іншим використанням цього ~є те, cd ~user/downloadщоб перейти до каталогу завантажень користувача.
ott--

5

Це 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 ~.

чому тоді було додано ~ в першу чергу?

Я б сказав, зручність та історичні причини, як це пояснено у пов'язаній відповіді про тильду. Врешті-решт вона зросла більш ніж просто розширенням домашнього каталогу.


0

Незалежно від того, чи є ви кілька рівнів папок вище або нижче $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

0

~ означає / home / username (ім’я користувача), тому ви заощаджуєте деякий час під час введення тексту. Наприклад, cd / home / username / Downloads те саме, що cd ~ / Downloads, але менше вводити текст. Обидві команди роблять те ж саме, змінюють робочий каталог на те місце.


Не зовсім. Наприклад , rootдомашній каталог «S, як правило , за межами/home
Дмитро Григор'єв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.