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?


2
Na marginesie, napis „wolontariusz”, z „u” zamiast „e” :)
— AER

2
Jestem liberalnym czarownikiem.
— j0h

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 
  ~+   ~-

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ą.


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.