Próbuję wyodrębnić inną część instalatora biblioteki Nvidia cuda. Używam następującego polecenia:
mkdir ~/Downloads/nvidia_installers
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
I otrzymuję następujący komunikat:
ERROR: extract: path must be absolute.
A kiedy wpisuję polecenie z dosłownym adresem mojego domu, działa idealnie.
./cuda_6.5.14_linux_64.run -extract=/home/likewise-open/XXX/username/Downloads/nvidia_installers
Jestem zdezorientowany, czy ~ nie powinno być takie samo jak / home / podobnie-open / XXX / nazwa użytkownika?
Przetestowany:
./cuda_6.5.14_linux_64.run -extract=$HOME/Downloads/nvidia_installers
i działa, ale nie wiem, dlaczego to nie pozwala ~
command-line
paths
Regan
źródło
źródło
Odpowiedzi:
Bash rozwija ~, jeśli jest to początek słowa. Widać to między następującymi poleceniami:
Bash szuka osobnych
~
znaków i~/
tej zamiany. Żadna inna kombinacja lub cytowana wersja nie będzie działać.$HOME
działa, ponieważ podstawienia zmiennych są bardziej niezawodne ($
jest to znak specjalny, podczas gdy~
jest o wiele mniej):Podczas gdy mówimy
~
, w rzeczywistości ma jeszcze kilka innych zastosowań zastępczych:~+
bieżący katalog roboczy (odczyt z$PWD
)~-
poprzedni katalog roboczy (odczyt z$OLDPWD
)Tak jak w przypadku zwykłego
~
, na końcu mogą znajdować się dodatkowe ścieżki, które ponownie muszą być przedrostkiem słowa, w przeciwnym razie Bash je zignoruje.Możesz przeczytać więcej na ten temat w
man bash | less -p ' Tilde'
źródło
zsh
jest (a raczej może być skonfigurowany) rozwiń~
po=
zbyt. Wśród innych wygodnych ulepszeń ma ponad bash.=
; chodzi o rozwinięcie na początku prawej strony przypisania zmiennej. To sprawia, że nasza sprawa jest nieco bardziej zagmatwana, gdy się nam przyjrzy - patrz moja odpowiedź. Izsh
nie różni się odbash
tego; Opis „zsh” jest nieco tajemniczy:info --subnodes zsh | less +/'14.7.4 Notes'
(brakuje stron podręcznika Zsh)zsh
jest bardzo konfigurowalny. W moim zshecho -extract=~/test
wyniki w-extract=/home/user/test
. Jest włączony przezMAGIC_EQUAL_SUBST
opcje. Na marginesie, wszystkie strony podręcznika Zsh są w porządku.zsh
konfigurowalność - i inne ulepszenia; Spodziewałbym się, że MAGIC_EQUAL_SUBST (objęty 14.7.4) jest domyślnie wyłączony i rzadko używany; Teraz jest to oczywiście bardziej odpowiednie, jeśli masz ogólnie włączone. Po uzyskaniu mojej sekcji z przykładami w dobrej formie, byłby to miły dodatek ...Naprawiam to
To polecenie wyświetla komunikat o błędzie „BŁĄD: wyciąg: ścieżka musi być bezwzględna”:
Błąd nie jest pomocny - program był już zbyt zagubiony.
Wiesz już, że błąd pochodzi od
~
, ponieważ$HOME
zamiast tego działa .Problem:
~
zostaje zastąpiony tylko na początku słowa.Na przykład działa to z tyldą:
Jeśli potrzebujesz składni opcji
=
, użycie $ HOME zamiast~
jest najbardziej czystym rozwiązaniem;Praktyka
Co powinieneś wiedzieć:
Istnieją specjalne przypadki, w których
~
get jest rozwijany, gdy nie jest na początku słowa: jako część przypisania zmiennej, bezpośrednio po=
. Co oczywiście jest mylące.Innym ważnym przypadkiem specjalnym jest użycie go ze zmiennymi takimi jak PATH. W przypisaniach zmiennych
~
jest również rozwijany po:
, podobnie jak po pierwszym=
.Znaczenie tylda
W skorupie
~
tylda nie jest tak naprawdę ścieżką.$HOME
Czasami zastępuje ją tylko ścieżka .Jest to coś w rodzaju skrótu lub skrótu, dostarczanego przez powłokę.
Nie można go używać jak ścieżki w ogóle, powłoka „rozszerza” ją na ścieżkę tylko w bardzo szczególnych miejscach.
I nawet jeśli jest rozwinięty, może być czymś innym niż katalog domowy.
:
lub=
$HOME
wtedy, gdy przed słowem nie będzie więcej znaków w słowie/
Problem w wierszu poleceń
Zgodnie z tym problem w twoim poleceniu polega na tym, że tylda się wchodzi
-extract=~/Downloads/nvidia_installers
nie jest rozwinięty, ponieważ nie jest to jeden z wymienionych przypadków. To wszystko.
Rozwiązaniem może być uczynienie tyldy pierwszym niecytowanym znakiem słowa, bez żadnego innego znaku przed następnym
/
- to właśnie otrzymujesz, gdy użyjesz opcji ze spacją przed argumentem opcji:-extract ~/Downloads/nvidia_installers
Innym rozwiązaniem byłoby użycie
$HOME
zamiast tego. W skrypcie jest to zwykle lepszy wybór.-extract=$HOME/Downloads/nvidia_installers
Komunikat o błędzie
Ale jak wyświetla się komunikat o błędzie
"ERROR: extract: path must be absolute."
?zmieścisz się w tym wszystkim?
Wiemy, że tylda nie uległa rozszerzeniu. Oznacza to, że program otrzymał tekst argumentu zawierający
~
, ale bez/home/auser
ścieżki jako. Ta ścieżka jest~/Downloads/nvidia_installers
- ale teraz nie ma powłoki, więc tylda nie ma specjalnego znaczenia. To tylko normalna nazwa katalogu. I jak każda inna ścieżka formyfoo/bar/baz
, jest to ścieżka względnaInne zastosowania
Jeśli po
~
, jak w~alice
- są znaki , jak w - z zachowaniem wszystkich powyższych zasad - i istnieją nazwy użytkownikówalice
, którealice
zamiast tego są rozszerzone do katalogu domowego , powiedzmyhome/alice
.Również, jeśli tak
bob
,~
rozwinąłby się/home/bob
i~bob
rozwinąłby się do tego samego.Wariant
~+
zostanie rozszerzony do bieżącego katalogu,$PWD
Aby odnieść się do poprzedniego katalogu, w którym byłeś przed ostatnim
cd
, możesz użyć~-
, który jest rozwinięty do$OLDPWD
.Jeśli użyjesz,
pushd
apopd
zamiastcd
, będziesz już wiedział, że można uzyskać dostęp do stosu katalogów jak~-2
.Detale
Wszystkie przypadki, w których
~
rozwinięto ścieżkę, są sprzedawane przez powłokę . W przypadku innych programów~
jest to zwykły znak nazwy pliku.Dla dokładnej definicji wewnątrz skorupy, tutaj jest odpowiedni odcinek nocie jak zastąpienie przez to tylko jeden szczególny przypadek wielu przypadkach: „Jeśli ta nazwa logowania jest łańcuchem null, tylda zastępowana jest wartością parametru powłoki HOME. „ :
man bash
~
$HOME
źródło
~
nie jest ścieżką samą w sobie. Jest to znak, który otrzymuje specjalne traktowanie z powłoki, gdzie~
lub~/
oznacza „zamień na ścieżkę katalogu domowego bieżącego użytkownika”.~username
oznacza „zamień na ścieżkę katalogu domowego nazwy użytkownika”.Ponieważ nie jest to ścieżka, jest rozpoznawana tylko w niektórych miejscach polecenia (jako pierwsza postać nowego tokena z podziałem spacji).
Po rozwinięciu został zastąpiony ścieżką bezwzględną.
Używanie
$HOME
działa, ponieważ HOME jest po prostu zmienną ustawioną przez powłokę i przestrzega normalnych reguł powłoki w celu zamiany zmiennych (dzieje się to przed podzieleniem danych wejściowych na spacje i wykonaniem).źródło
Masz rację. ~ / Downloads to to samo, co / home / nazwa użytkownika / Downloads.
Niektórzy instalatorzy i ekstraktorzy są bardzo wybredni, jeśli chodzi o to, gdzie trzeba je umieścić. Myślę, że może tak być, ponieważ rejestruje ścieżki plików, a dzienniki nie będą akceptować ~ w przyjętej ścieżce.
Właśnie przyzwyczaiłem się do pisania w / home / username. :)
źródło