$HOME
i ~
zwykle odnoszą się do tego samego. Oznacza to, że są ścieżką do katalogu „user home”, który ma ogólną postać „/ home / userName”.
Kiedy, jeśli w ogóle, nie odnoszą się one do tego samego katalogu?
home-directory
H2ONaCl
źródło
źródło
~
znaczy powłoki zależne natomiast $ HOME nie jest.Odpowiedzi:
Zarówno
$HOME
i~
punkt w tym samym folderze, w katalogu domowym użytkownika bieżącego, ale oba są bardzo różne rzeczy.$HOME
jest zmienną środowiskową , która zawiera folder domowy bieżącego użytkownika.~
jest symbolem rozszerzenia powłoki , tj. jednym z symboli przetwarzanych przed wykonaniem właściwego polecenia.~
sam rozwija się do wartości $ HOME.~nemo
rozwija się do katalogu domowego użytkownikanemo
. Symbol rozwinięcia powłoki to znak (lub para znaków), który jest przetwarzany / interpretowany przez powłokę w celu zbudowania rzeczywistego polecenia. Innym przykładem symbolu rozwinięcia powłoki*
jest rozszerzenie nazw plików.źródło
~
rozwija się do $ HOME lub% APPDATA% w systemie Windows. Jeśli nie są zdefiniowane, szuka ścieżki w „bazie danych haseł” (co zwykle oznacza/etc/passwd
, ale może to być LDAP lub inne źródło danych). Jakieś 20 lat temu mogłeś zostać ostrzeżony, że $ HOME może nie być ustawiony na niektórych komputerach, podczas gdy na pewno zostanie~
rozwinięty do czegoś.~
rozwija się do$HOME
(równy$HOMEPATH
), a nie$APPDATA
. A na cmd.exe~
nie rozwija się.HOME
to zmienna środowiskowa (koncepcja systemu operacyjnego, w powłokach sh, na przykład ustawiona za pomocąexport
lubdeclare -x
), a nie zmienna powłoki (której definicja zależy całkowicie od powłoki, ale w powłokach sh jest zwykle ustawiana za pomocąfoo=value
lub zset
kilkoma innymi sposoby).Różnią się między sobą tym, w jaki sposób powłoka Bash przekształca je, gdy są ujęte w
"
cudzysłów.Jeśli używasz w
echo
ten sposób, bez cudzysłowów, to~
i$HOME
masz ten sam efekt:Jednak
"
wokół znaków cudzysłowu wynik jest różny:źródło
~
rozwija się tylko jako część przedrostka tyldy, który z definicji musi zaczynać się na początku słowa. Ponadto, ponieważ kiedyś był częścią wzorców globowania,~
nie będzie działał w cudzysłowie. Tak więc"~"
luba~b
spowoduje zachowanie dosłownej wartości~
.Pojedyncza
~
(lub~
następująca po niej/
) zostanie rozwinięta do domu bieżącego użytkownika:~
Następnie nazwę użytkownika wzrośnie do katalogu domowego danego użytkownika:Po nich
~
następuje a+
lub a-
i opcjonalny numer zostaną rozwinięte do elementów stosu katalogów :$HOME
jest odpowiednikiem pojedynczego~
, który zamiast tego przestrzega reguł składniowych dla zmiennych. Na przykład, rozwija się wewnątrz podwójnych cudzysłowów, można go rozbroić i można do niego zastosować operandy do manipulacji ciągami .źródło
Zależy to w dużej mierze od rozszerzenia. W bash
~
jest wygodnym sposobem na uzyskanie katalogu domowego bez uruchamiania rozszerzenia nazwy pliku ani dzielenia słów, nawet jeśli nie jest cytowany. Na przykład:Lub:
Więc jeśli zmagasz się z cytatami z jakiegoś powodu (w takim przypadku naprawdę powinieneś przemyśleć całość, łatwiej jest walczyć ze świniami),
~
może być wygodniejsze.Gdzie indziej, na przykład w Pythonie
~
i$HOME
muszą zostać rozszerzone o różne funkcje . Niektóre inne miejsca dopuszczają zmienne i nie pozwalają na inną składnię powłoki, taką jak symbole wieloznaczne lub interpretacja tyldy (np.~/.pam_environment
, Która ma specjalną składnię do interpretacji zmiennych). Jeszcze inne miejsca zezwalają na interpretację tyldy jako wyjątek (np. Systemd ), ale zamiast używać zapytania bezpośrednio do bazy danych passwd$HOME
.źródło
$HOME
, ale nie możesz (bezpośrednio) zmienić wartości~
.$HOME
i~
nie odnoszą się do tej samej rzeczy - zwykle robią to domyślnie - a następnie celowo przypisujesz zmienną środowiskową, aby nie odnosiły się do tej samej rzeczy. To dobra demonstracja, ale niepotrzebnie myląca.$ HOME / jest bardziej prawdopodobne, że będzie działać w standardowym POSIX.2 Bourne / bin / sh, ponieważ rozszerzenie tyldy jest rozszerzeniem występującym w BSD csh tcsh GNU bash i innych.
Jeśli chcesz pisać skrypty przenośne na busyboksie, desce rozdzielczej lub BSD sh, zainwestuj w dodatkowe litery, abyś nie zawiesił się przy ~ /: brak takiego pliku lub katalogu w niektórych systemach.
Uważam też, że $ HOME / jest bardziej czytelny.
źródło
$HOME
i rzadko używają~
. Moje poprzednie ja prawdopodobnie to wiedziało.