Różnica między „cd” a „cd ~”

10

Zastanawiam się, jeśli sam cd wysyła mnie do mojego folderu domowego, a cd ~ robi to samo, to dlaczego ~ zostało dodane w pierwszej kolejności?

Czy jest to coś specyficznego dla BASH, czy zachowaliby się inaczej w innej Skorupie?

Luis Alvarado
źródło
2
Zdecydowanie nie duplikat. Że pytanie jest pytaniem o cd ~vs cd $HOMEvs cd ~not-tandu. To pytanie jest pytaniem o cdvs cd ~.

Odpowiedzi:

17

~Może być stosowany dłużej niż tylko to. Każde polecenie może zyskać na skrócie do folderu domowego. Więc nie jest konieczne, jeśli chcesz cd do domu, ale co z tego ~/.config?

$ cd ~/.config

W przeciwnym razie będziesz musiał zapisać ścieżkę główną, użyć $HOMEvar lub zrobić dwa cds. Również do kopiowania lub przenoszenia plików:

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

Ponieważ większość plików znajduje się w domu, zawsze dobrze jest mieć skrót.

ahilsend
źródło
Cześć ahilsend, właściwie moje pytanie jest bardziej zorientowane na to, dlaczego 2 sposoby. Wiem już o ~ używaniu zmiennej $ HOME, ale mając to na uwadze, dlaczego sama „CD” również wysyła mnie do domu. Dlaczego 2 sposoby na ten sam cel?
Luis Alvarado
4
@CYREX Domyślam się, aby zapisać pisanie na bardzo częsty przypadek chęci przeniesienia się do katalogu domowego.
CVn 27.07.13
1
Innym zastosowaniem ~jest cd ~user/downloadprzejście do katalogu pobierania użytkownika.
ott--
5

Wykonywanie cd to w zasadzie wywoływanie cdbez argumentów i zgodnie z cdzachowaniem „... jeśli nie podano katalogu, wartość zmiennej powłoki HOME jest wartością domyślną”. (z podręcznika bash ). W przeciwieństwie do tego, cd ~gdy podasz argument do cdpolecenia, co się dzieje ~i powłoka wykona rozwinięcie tyldy . Jeśli chodzi o powrót do katalogu domowego użytkownika - nie ma różnicy. W obu przypadkach HOMEkwerenda środowiskowa zostanie zapytana:

$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'                                      
/usr
/usr

W rzeczywistości nie ma to również różnicy cd $HOME. Jednak, choć cdzrobi to jedno, tylda może być używana do wykonywania innych rozszerzeń, takich jak ~+bieżący katalog roboczy.

Jednak co ciekawe, możemy unset HOMEsię złamać, cdale ~nadal będziemy działać:

$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'                                    
bash: line 0: cd: HOME not set
/usr
/home/xieerqi

Dlaczego ? Ponownie odpowiedz w instrukcji:

Jeśli HOME jest wyłączone, katalog domowy użytkownika wykonującego powłokę jest zastępowany. W przeciwnym razie przedrostek tyldy zostanie zastąpiony katalogiem domowym powiązanym z określoną nazwą logowania.

Zauważ, że rozbrojenie różni się od tworzenia pustych zmiennych HOME=i ma wpływ. Dokumentacja mówi konkretnie o rozbrojeniu zmiennej. Ustawienie zmiennej równej pustemu ciągowi znaków daje efekt odwrotny do tego, czego byśmy oczekiwali:

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

Tutaj widać, że wykonanie HOMEpustego łańcucha łamie zarówno tyldę, jak i cdzachowanie.


Tylda i $HOMEmają nieco różnicę i inny powód istnienia. $HOMEjest zmienną powłokową, która również przypadkowo jest jedną ze zmiennych środowiskowych - i jest dostępna dla wszystkich programów; w C użyłbyś environ()do uzyskania dostępu do tego. Natomiast tildejest to składnia specyficzna dla powłoki, która wykonuje interpretację tyldy, chociaż można również użyć wordexp()funkcji do wykonania ekspansji podobnej do powłoki ( odniesienia ) również w C.

Powód, dla którego ~reprezentacja HOMEzostała udzielona w tym pytaniu : Pewnego razu znak tylda dzielił ten sam klucz z HOMEterminalem Lear-Siegler ADM-3A. HOMEnatomiast zmienna środowiskowa, która miała czysto symboliczne znaczenie i nie posiadała fizycznych reprezentacji.

Ponadto fakt, że HOMEjest zmienną środowiskową, pozwala ją rozbroić, ponieważ nie możemy ustawić ~czegoś innego za pomocą prostych środków.

# 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

Zwróć uwagę na pusty wiersz, w którym najpierw echowypisuje zmienną nieustawioną, oraz fakt, że. W przeciwieństwie do tego, nie możemy robić takich rzeczy dla tyldy:

$ 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

Jednak zmiana HOMEwpływa na ~:

$ env 'HOME=' bash -c 'echo $HOME; stat ~;'                                 

stat: cannot stat '': No such file or directory

Ponadto, ponieważ ~działa również jako znak rozszerzenia, możemy zrobić takie rzeczy, aby wyświetlić bieżący katalog roboczy:

$ bash -c 'cd /etc/;stat -c "%n" ~+'                                        
/etc

Podczas gdy jeśli chcemy to zrobić za pomocą zmiennych środowiskowych, potrzebujemy PWDi HOMEpozostajemy tacy sami, lub jeśli robimy takie rzeczy echo $HOME+- to tylko połączenie łańcuch / zmienna. Ale ponownie ~+pobiera informacje ze zmiennych środowiskowych:

$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'                             
/usr

UWAGA : rozszerzenia ~+i ~-działają w ksh, ale nie w dash.


Aby odpowiedzieć na niektóre z Twoich szczegółowych pytań:

Czy jest to coś specyficznego dla BASH, czy zachowaliby się inaczej w innej Skorupie?

Nie, to powinno być konsekwentne zachowanie. ksh, dashi csh- wszystkie zachowują się tak samo z cdlub cd ~.

dlaczego więc ~ zostało dodane w pierwszej kolejności?

Powiedziałbym, że wygoda i powody historyczne zostały wyjaśnione w powiązanej odpowiedzi na temat tyld. W końcu stało się to czymś więcej niż tylko rozszerzaniem katalogu domowego.

Sergiy Kolodyazhnyy
źródło
0

Bez względu na to, czy masz kilka poziomów folderów powyżej czy poniżej $HOME, polecenia cdi cd ~rób to samo i nie różnią się - odeśle cię z powrotem do katalogu HOME.

JEDNAK: Gdy masz 1 lub więcej poziomów folderów powyżej HOME i chcesz BEZPOŚREDNIO przejść do podkatalogu 1 lub więcej poziomów folderów poniżej $HOME, tilde ( ~) przydaje się, oszczędzając naciśnięcia klawiszy, gdy zastępujesz tekst potrzebny do odwołania aby $HOMEpodczas wpisywania cdpolecenia. Na przykład;

/$ 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
P Alexander
źródło
0

~ oznacza lokalizację / home / nazwa użytkownika, więc oszczędzasz trochę czasu podczas pisania. Na przykład cd / home / nazwa użytkownika / Pobrane pliki są takie same jak cd ~ / Pobrane pliki, ale mniej pisania. Oba polecenia robią to samo, zmień katalog roboczy na tę lokalizację.

Ionut
źródło
Nie całkiem. Np. rootKatalog domowy jest zwykle na zewnątrz/home
Dmitrij Grigoriew