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.png
w 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?
Odpowiedzi:
~
jest twoim katalogiem domowym.~foo
to katalog domowy użytkownikafoo
, jeśli taki użytkownik istnieje, lub tylko katalog o nazwie~foo
, jeśli ten użytkownik nie istnieje.Dlatego w:
~Desktop
rozwinie się do katalogu domowego użytkownikaDesktop
, jeśli taki użytkownik istnieje (i zwykle nie istnieje), lub będzie po prostu~Desktop
(ścieżka, która zwykle nie istnieje).W:
~/j0h
rozwinie się do katalogu o nazwiej0h
wjay
katalogu 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 trakciescp
operacji.A jeśli używasz
pushd
ipopd
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
~+N
N
dirs
~-N
N
Następnie do katalogów na stosie można uzyskać dostęp za pomocą:
źródło
~+
zawsze jest to równoważne z.
tym, prawda? Wydaje się zbędny.~+
i~-
użyj wartości$PWD
i$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 -C
jest przykładem, chociaż przyznaję, że nie mogę wymyślić dobrego zastosowania~+
.$PWD
byłoby równie dobre, z tym wyjątkiem, że nie musisz cytować,~+/foo/bar
jeśli$PWD
zawiera spacje../filename
ale 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 jakln
lubtar
.)Przeczytaj dokumentację GNU dotyczącą rozszerzenia Bash Tilde (tak jak powinienem to zrobić przed pierwszą iteracją tej odpowiedzi).
~/Desktop
i~j0h
robią zasadniczo różne rzeczy, co wyjaśnia, dlaczego~Desktop
nie działa:Zwykły
~
zastępuje bieżącą$HOME
zmienną środowiskową, ustawianą podczas logowania. Więc~
postanawia/home/oli
dla mnie i~/Desktop
czyta jako/home/oli/Desktop
. W tym miejscu najczęściej używana jest tilda.~username
rozwiązuje do domu tego użytkownika , zgodnie z ustawieniem w/etc/passwd
. Więc~oli
postanawia/home/oli
,~j0h
może zdecydować,/home/j0h
ale niekoniecznie, twój homedir może być w dowolnym miejscu.~not-a-username
nie rozwiązuje. PonieważDesktop
nie jest użytkownikiem,~Desktop
nie 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,
scp
gdyby zostały zastąpione lokalnymi wartościami). Działa to, ponieważ Bash nie zastąpi~...
go, jeśli będzie poprzedzony tylko spacją.źródło
getent passwd bin
mówi~dir
jest 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. ” Tutajdir
nie ma nazwy użytkownika w tym systemie, więc pozostaje niezmieniony.Symbol
~
jest używany jako skrót do/home/user
inbash
, więc w takim przypadku~/Desktop/Volenteer.png
jest skrótem/home/user/Desktop/Volenteer.png
.Jak widać
/
, jak zawsze pokazuje nowy poziom w hierarchii systemu plików.źródło
~{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)/usr
.~
jest skrótem dla zmiennej środowiskowej$HOME
w 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: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/passwd
sposób:Spowoduje to wyświetlenie listy każdego lokalnego użytkownika i jego katalogu domowego.
źródło