Naprawiam to
To polecenie wyświetla komunikat o błędzie „BŁĄD: wyciąg: ścieżka musi być bezwzględna”:
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
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ą:
echo -extract ~/Downloads
Jeśli potrzebujesz składni opcji =
, użycie $ HOME zamiast ~
jest najbardziej czystym rozwiązaniem;
echo -extract=$HOME/Downloads
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 =
.
$ dir=~ sh -c 'echo D2: $dir'
D2: /home/user
$ sh -c 'echo D2: $dir' dir=~
D2:
$ echo Dir: $dir
Dir:
$ dir=~; sh -c 'echo D2: $dir'
D2:
$ echo Dir: $dir
Dir: /home/user
$ sh -c 'echo D2: $dir'; d3=~
D2:
$ echo d3: $d3
d3: /home/user
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.
- Jest rozwijany tylko na początku słowa lub w zmiennej zmiennej po
:
lub=
- Jest rozszerzany tylko wtedy, gdy nie znajduje się w cudzysłowie
- Zostanie rozwinięty tylko
$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 formy foo/bar/baz
, jest to ścieżka względna
Inne zastosowania
Jeśli po ~
, jak w ~alice
- są znaki , jak w - z zachowaniem wszystkich powyższych zasad - i istnieją nazwy użytkowników alice
, które alice
zamiast tego są rozszerzone do katalogu domowego , powiedzmy home/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
a popd
zamiast cd
, 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
Tilde Expansion
If a word begins with an unquoted tilde character (`~'), all of the charac‐
ters preceding the first unquoted slash (or all characters, if there is no
unquoted slash) are considered a tilde-prefix. If none of the characters
in the tilde-prefix are quoted, the characters in the tilde-prefix follow‐
ing the tilde are treated as a possible login name. If this login name is
the null string, the tilde is replaced with the value of the shell parame‐
ter HOME. If HOME is unset, the home directory of the user executing the
shell is substituted instead. Otherwise, the tilde-prefix is replaced with
the home directory associated with the specified login name.
If the tilde-prefix is a `~+', the value of the shell variable PWD replaces
the tilde-prefix. If the tilde-prefix is a `~-', the value of the shell
variable OLDPWD, if it is set, is substituted. If the characters following
the tilde in the tilde-prefix consist of a number N, optionally prefixed by
a `+' or a `-', the tilde-prefix is replaced with the corresponding element
from the directory stack, as it would be displayed by the dirs builtin
invoked with the tilde-prefix as an argument. If the characters following
the tilde in the tilde-prefix consist of a number without a leading `+' or
`-', `+' is assumed.
If the login name is invalid, or the tilde expansion fails, the word is
unchanged.
Each variable assignment is checked for unquoted tilde-prefixes immediately
following a : or the first =. In these cases, tilde expansion is also per‐
formed. Consequently, one may use filenames with tildes in assignments to
PATH, MAILPATH, and CDPATH, and the shell assigns the expanded value.