~ to $ HOME, ale czasami?

14

cd ~

robi to samo co

cd $HOME

który jest również taki sam jak

cd /home/tandu

Jednak,

cd ~not-tandu

zmiany w /home/not-tandu

Czy to jest wybór wyłącznie składniowy? Jak cdradzi sobie z tym jądro (lub plik wykonywalny?) Czy istnieje specjalny przypadek ~dodania ukośnika, jeśli wszystko inne zostanie pominięte? To znaczy, ~/i ~przejdź do tego samego katalogu, ale ~ajest o jeden katalog wyżej. Tego samego nie można powiedzieć o żadnym innym katalogu, w którym się zmienisz.

Pigułki przeciwwybuchowe
źródło
3
Nie krępuj się porównać ~ not-tandu i ~ / not-tandu, jeden wskazuje na użytkownika katalog domowy nie-tandu, a drugi wskazuje na katalog re-tandu w twoim katalogu domowym.
Johan
4
To nie jest jądro ani „plik wykonywalny CD” (ponieważ nie ma czegoś takiego) - to wbudowana powłoka.
Paul Tomblin,
Ponieważ nie wspominasz o tym: cdbez żadnych parametrów działa jak cd ~. Jeśli zastąpi cdsię echomożna zobaczyć do czego wyrazem jest rozszerzany przez powłokę.
jofel

Odpowiedzi:

18

~jest aliasem $HOMEudostępnianym przez wiele powłok, ale $HOMEjest bardziej uniwersalny. $HOMEfaktycznie prosi powłokę o wstawienie (zastąpienie) zmiennej środowiskowej HOME tutaj. Istnieje wiele różnych zmiennych środowiskowych, które można zastąpić, spróbuj uruchomić envlistę. Pamiętaj, że ~nie zawsze jest rozpoznawane, gdy nie ma na początku słowa. Wypróbuj te dwa polecenia do porównania:

ls /~
ls /$HOME

Pierwszy jest przekazywany do pliku wykonywalnego ls, /~który następnie próbuje spojrzeć na plik wywołany ~w katalogu głównym, drugi jest rozszerzany $HOMEi staje się, //home/userktóry jest następnie przekazywany do pliku wykonywalnego ls jako argument wiersza poleceń. Wszystkie systemy POSIX (POSIX jest standardem działania systemów UNIX i Linux) pozwalają na traktowanie wielu ukośników tak samo jak jednego ukośnika, więc //home/userto samo co powiedzenie /home/user. ~usernamejest skrótem od polecenia powłoki, aby szukała nazwy użytkownika w pliku passwd i zwróciła swój katalog domowy. Nie ma równoważnej zmiennej środowiskowej. Wszystkie te podstawienia są wykonywane przez powłokę i są obsługiwane przez większość z nich, ale tylko takie zmienne środowiskowe $HOMEsą obsługiwane przez wszystkie powłoki. Również,cdjest właściwie wbudowanym poleceniem. Jest to specjalna dyrektywa, która nakazuje samej powłoce zmianę katalogów. To nie jest tak, jak inne wbudowane powłoki, które mogą być zaimplementowane jako osobne pliki wykonywalne, echoponieważ są używane do zmiany podstawowego atrybutu procesu powłoki. echojest jedynie powłoką wbudowaną ze względu na wydajność, ale w dawnych czasach UNIX był dostępny tylko jako własny plik wykonywalny /bin/echo.

penguin359
źródło
re ", który następnie próbuje spojrzeć na plik o nazwie ~ w katalogu głównym"; To dotyczy wszystkich smaków unixowych?
Pacerier
17

~foo oznacza „katalog domowy użytkownika foo”.

Jądro tego nie robi, jest interpretowane przez powłokę. Ilekroć powłoka widzi ~fooargument, w sposób przejrzysty zastępuje go katalogiem domowym użytkownika fooi przekazuje go na swoje miejsce. Więc kiedy uruchomisz cd ~tandu, powłoka faktycznie działa cd /home/tandu.

Patrick
źródło
1
Co konkretnie zastępuje to i jakim algorytmem? Czy to cdjest skorupa? Co jeśli nie korzystasz z powłoki? Czy to proste „jeśli po czymś coś się rozwija, rozwija się inaczej?” czy jest jakiś inny sposób postępowania w przypadku tego wyjątkowego stanu?
Tabletki przeciwwybuchowe
8
Zobacz instrukcję Bash na temat rozszerzenia Tilde . (Wiele innych powłok i programów
podlega
4
@ tandu: powłoka działa cd, nie ma zewnętrznego pliku wykonywalnego (nie byłoby to możliwe)
Mat
1
@ tandu: jeśli nie używasz powłoki (np. próbujesz tego za pomocą exec(2)), rozszerzenie powłoki nie ma miejsca. Bez rozszerzenia powłoki ~nic nie zostanie zastąpione - to po prostu kolejna doskonale poprawna postać. To mnie ugryzło we wczesnych dniach SunOS, ponieważ /bin/shnie miałem problemów ~.
Alexios
5

~ następnie nazwa użytkownika rozwija się do katalogu domowego tego użytkownika.

Ignacio Vazquez-Abrams
źródło