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ć $HOME
var lub zrobić dwa cd
s. 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/download
przejście do katalogu pobierania użytkownika.
Wykonywanie cd
to w zasadzie wywoływanie cd
bez argumentów i zgodnie z cd
zachowaniem „... 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 cd
polecenia, 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 HOME
kwerenda ś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ć cd
zrobi to jedno, tylda może być używana do wykonywania innych rozszerzeń, takich jak ~+
bieżący katalog roboczy.
Jednak co ciekawe, możemy unset HOME
się złamać, cd
ale ~
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 HOME
pustego łańcucha łamie zarówno tyldę, jak i cd
zachowanie.
Tylda i $HOME
mają nieco różnicę i inny powód istnienia. $HOME
jest 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 tilde
jest 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 HOME
została udzielona w tym pytaniu : Pewnego razu znak tylda dzielił ten sam klucz z HOME
terminalem Lear-Siegler ADM-3A. HOME
natomiast zmienna środowiskowa, która miała czysto symboliczne znaczenie i nie posiadała fizycznych reprezentacji.
Ponadto fakt, że HOME
jest 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 echo
wypisuje 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 HOME
wpł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 PWD
i HOME
pozostajemy 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
, dash
i csh
- wszystkie zachowują się tak samo z cd
lub 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 cd
i 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 $HOME
podczas wpisywania cd
polecenia. 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ę.
root
Katalog domowy jest zwykle na zewnątrz/home
cd ~
vscd $HOME
vscd ~not-tandu
. To pytanie jest pytaniem ocd
vscd ~
.