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?
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?
Odpowiedzi:
~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.
~jest cd ~user/downloadprzejście do katalogu pobierania użytkownika.
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.
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
~ 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ę.
rootKatalog domowy jest zwykle na zewnątrz/home
cd ~vscd $HOMEvscd ~not-tandu. To pytanie jest pytaniem ocdvscd ~.