W jaki sposób używanie tyldy działa jako skrót do mojego katalogu domowego?

30

Byłem zdezorientowany, próbując skopiować niektóre pliki z jednego komputera na inny. Rozpracowałem to, ale składnia jest nadal dla mnie myląca. To działa:

scp ~/Desktop/Volenteer.png jay@server.ip:~j0h/b

który umieszcza Volenteer.pngw folderze /home/j0h/b. Jednak to nie działa:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

To również kończy się niepowodzeniem, ponieważ plik statusu statusu wyjścia 1 nie został znaleziony:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

Jak to robi:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

Tak wyraźnie, jest jakaś różnica między ~i ~/ Ta różnica jest obecnością/

$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory

Dlaczego więc w scp ~postanawia ~/? Zgaduję, nie mogę sprawdzić, co się dzieje. Ale wydaje się niespójne, a zatem mylące. Czy to błąd w scp? czy jest coś w tyldach, których mi brakuje?

j0h
źródło
2
Na marginesie, napis „wolontariusz”, z „u” zamiast „e” :)
AER
2
Jestem liberalnym czarownikiem.
j0h
Powiązane pytanie: askubuntu.com/q/972319/295286
Sergiy Kolodyazhnyy

Odpowiedzi:

68

~ jest twoim katalogiem domowym.

~footo katalog domowy użytkownika foo, jeśli taki użytkownik istnieje, lub tylko katalog o nazwie ~foo, jeśli ten użytkownik nie istnieje.


Dlatego w:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

~Desktoprozwinie się do katalogu domowego użytkownika Desktop, jeśli taki użytkownik istnieje (i zwykle nie istnieje), lub będzie po prostu ~Desktop(ścieżka, która zwykle nie istnieje).


W:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

~/j0hrozwinie się do katalogu o nazwie j0hw jaykatalogu domowym, który ponownie prawdopodobnie nie będzie istniał.


To nie jest ~i ~/gdzie występuje różnica, ale w ~i ~foo.


Dodatkowo ~można go również używać do nawigacji po historii katalogów:

  • ~-to poprzedni katalog roboczy (jak $OLDPWD)
  • ~+jest bieżącym katalogiem roboczym (jak $PWD)

Nie dotyczy to scp, ponieważ nie można zmieniać katalogów w trakcie scpoperacji.

A jeśli używasz pushdipopd do utrzymywania stosu katalogów, i byłby to katalog th na stosie katalogów, jak widać na wyjściu . będzie to katalog th od końca (w obu przypadkach liczony od zera). Na przykład:~N~+NNdirs~-NN

$ for i in etc usr var tmp; do pushd /$i; done
/etc ~/.vim
/usr /etc ~/.vim
/var /usr /etc ~/.vim
/tmp /var /usr /etc ~/.vim

$ dirs
/tmp /var /usr /etc ~/.vim

Następnie do katalogów na stosie można uzyskać dostęp za pomocą:

/tmp /var /usr /etc ~/.vim
  ~0   ~1   ~2   ~3     ~4
 ~+0  ~+1  ~+2  ~+3    ~+4
 ~-4  ~-3  ~-2  ~-1    ~-0 
  ~+   ~-
muru
źródło
Czy ~+zawsze jest to równoważne z .tym, prawda? Wydaje się zbędny.
Wildcard,
1
@ Cudowna karta pocztowa, niezupełnie. ~+i ~-użyj wartości $PWDi $OLDPWD, które są ścieżkami bezwzględnymi. .jest zawsze ścieżką względną. Tak więc, jeśli istnieje polecenie, które zmienia bieżący katalog roboczy podczas wykonywania, zobaczy nową ścieżkę dla ., gdzie ścieżka rozwinięta ~-pozostanie taka sama. tar -Cjest przykładem, chociaż przyznaję, że nie mogę wymyślić dobrego zastosowania ~+. $PWDbyłoby równie dobre, z tym wyjątkiem, że nie musisz cytować, ~+/foo/barjeśli $PWDzawiera spacje.
mur
1
Dzięki, to wyjaśnia. Właściwie jest to dobry przykład użycia: Niektóre polecenia odmawiają działania na ścieżkach względnych ze względów bezpieczeństwa; z takimi poleceniami, których nie możesz użyć, ./filenameale możesz użyć "$PWD/filename"lub prościej ~+/filename. (Niektóre polecenia będą działać na względnych ścieżkach, ale istnieje różnica funkcjonalna, taka jak lnlub tar.)
Wildcard,
21

Przeczytaj dokumentację GNU dotyczącą rozszerzenia Bash Tilde (tak jak powinienem to zrobić przed pierwszą iteracją tej odpowiedzi).

~/Desktopi ~j0hrobią zasadniczo różne rzeczy, co wyjaśnia, dlaczego ~Desktopnie działa:

  • Zwykły ~zastępuje bieżącą $HOMEzmienną środowiskową, ustawianą podczas logowania. Więc ~postanawia /home/olidla mnie i ~/Desktopczyta jako /home/oli/Desktop. W tym miejscu najczęściej używana jest tilda.

  • ~usernamerozwiązuje do domu tego użytkownika , zgodnie z ustawieniem w /etc/passwd. Więc ~olipostanawia /home/oli, ~j0hmoże zdecydować, /home/j0hale niekoniecznie, twój homedir może być w dowolnym miejscu.

  • ~not-a-usernamenie rozwiązuje. Ponieważ Desktopnie jest użytkownikiem, ~Desktopnie jest podstawiony. Jest traktowany dosłownie jako plik lub ścieżka o nazwie ~Desktop(która tutaj nie istnieje).

I nie trzeba dodawać, że wszystko dzieje się zdalnie (byłoby bezużyteczne, scpgdyby zostały zastąpione lokalnymi wartościami). Działa to, ponieważ Bash nie zastąpi ~...go, jeśli będzie poprzedzony tylko spacją.

Oli
źródło
Co getent passwd binmówi
muru
2
„bin” to użytkownik systemu na większości komputerów z systemem Linux, z katalogiem domowym / bin.
fNek
1
Niepowodzenie rozwinięcia ~dirjest zgodne z dokumentami GNU: „... znaki w prefiksie tyldy po tyldie są traktowane jako możliwa nazwa logowania ... Jeśli nazwa logowania jest nieprawidłowa lub rozszerzenie tyld nie powiedzie się, słowo pozostaje bez zmian. ” Tutaj dirnie ma nazwy użytkownika w tym systemie, więc pozostaje niezmieniony.
apsillers
Dziękuje wszystkim. Powinienem chyba przeczytać linki, które zamieszczam :)
Oli
4

Symbol ~jest używany jako skrót do /home/userin bash, więc w takim przypadku ~/Desktop/Volenteer.pngjest skrótem /home/user/Desktop/Volenteer.png.

Jak widać /, jak zawsze pokazuje nowy poziom w hierarchii systemu plików.

Mark Kirby
źródło
3
tylko w połowie dobrze, jest to skrót od zmiennej środowiskowej $ HOME. ~{user}/może to być dowolna losowa ścieżka ustawiona w pliku bazy danych passwd (5). Chociaż tak, standardy filesytem.org umieszczają zwykłych użytkowników w / home, ale nie dotyczy to każdego użytkownika (tj. Root w / root i usługi w / var / ... lub starszych unixach używających / usr zamiast / home)
Dwight Spencer,
DwightSpencer jest poprawny. Utrzymuję kilka serwerów, na których użytkownicy znajdują się w / usr / {NAZWA KLIENTA} / home / i są współużytkowani przez kilka wewnętrznych i zdalnych systemów (wszystkie wskazują na ten katalog), więc wystarczy tylko jeden system. I ~ wskazuje na ten katalog;)
Rinzwind
3
@Rinzwind eek. Muszę zaprotestować przeciwko temu świętokradczemu niewłaściwemu użyciu /usr.
muru
@muru hej, to nie było MOJE wezwanie>: - D To pozostało z SCO D:
Rinzwind
1
Szczerze, podobało mi się korzystanie z / usr dla wszystkich rzeczy użytkownika, ponieważ to pierwotnie to oznaczało. To, co obecnie znajduję, to bardziej świętokradcze niewłaściwe użycie / usr / bin jako wielkiego zunifikowanego miejsca zrzutu wszystkich plików binarnych (sys, user, sysop) poza podstawowymi binutils. Po tym wszystkim / usr miało oznaczać, że wszystkie rzeczy, do których użytkownicy mają dostęp, zostały pobrane z montowania nfs, podczas gdy / usr / local to lokalna przestrzeń użytkownika z / sbin jako binariami sysop i binariami systemu / bin. Rozumiem, że / home może być inną partycją, ale więc / usr / home / ... utrzymanie go w / usr zachowuje jako przestrzeń nazw użytkowników zarówno w polityce, implementacji, jak i sposobie myślenia.
Dwight Spencer,
3

~jest skrótem dla zmiennej środowiskowej $HOMEw większości powłok pochodnych c / obsługujących powłoki zgodne z POSIX. najczęstszym zastosowaniem ~jest odniesienie do własnego katalogu domowego lub katalogu domowego innego użytkownika:

cd ~ # ie shell, take me to my home folder

cd ~root # i.e. shell, take me to root's home folder

Aby znaleźć katalog domowy dla dowolnego lokalnego użytkownika w systemie POSIX (UNIX, Linux, OS X, BSD), który korzysta z bazy danych passwd (5), uruchom awk w następujący /etc/passwdsposób:

awk -F: '{ print $1,$(NF-1) }' /etc/passwd

Spowoduje to wyświetlenie listy każdego lokalnego użytkownika i jego katalogu domowego.

Dwight Spencer
źródło