Il suffit de le réparer
Cette commande affiche un message d'erreur "ERREUR: extraire: le chemin doit être absolu":
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
L'erreur n'est pas utile - le programme était déjà trop confus.
Vous savez déjà que l'erreur provient de la ~
, car cela fonctionne à la $HOME
place.
Le problème: est ~
seulement remplacé au début d'un mot.
Par exemple, cela fonctionne avec le tilde:
echo -extract ~/Downloads
Si vous avez besoin de la syntaxe d'option avec =
, utiliser $ HOME à la place de ~
est la solution la plus propre.
echo -extract=$HOME/Downloads
La pratique
Ce que vous devriez savoir:
Il y a des cas spéciaux où ~
get est développé quand il ne se trouve pas au début d'un mot: dans le cadre d'une affectation de variable, juste après le =
. Ce qui est déroutant ici, bien sûr.
L’autre cas particulier important est l’utilisation avec des variables comme PATH. Dans les affectations de variables, ~
est également développé après :
, comme après le premier =
.
$ 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
Le sens du tilde
Dans un shell, ~
le tilde n'est pas vraiment un chemin. Il est seulement remplacé par un chemin $HOME
, quelques fois.
C'est quelque chose comme un raccourci, ou une abréviation, fourni par le shell.
Il ne peut pas être utilisé comme un chemin en général, le shell le "développe" en chemin seulement dans des endroits très spéciaux.
Et même s'il est étendu, cela peut être autre chose que le répertoire personnel.
- Il est développé uniquement au début d'un mot ou dans une affectation de variable après un
:
ou=
- Il est seulement étendu si c'est pas entre guillemets
- Il est étendu uniquement
$HOME
s’il n’ya plus de caractères dans le mot avant une/
Le problème en ligne de commande
Selon cela, le problème dans votre commande est que le tilde dans
-extract=~/Downloads/nvidia_installers
n'est pas développé, car ce n'est pas l'un des cas énumérés. C'est tout.
La solution pourrait consister à faire du tilde le premier caractère non cité entre mots, sans autre caractère avant le suivant /
- c'est exactement ce que vous obtenez lorsque vous utilisez une option avec un espace avant l'argument d'option:
-extract ~/Downloads/nvidia_installers
Une autre solution serait d'utiliser à la $HOME
place. Dans un script, c'est généralement le meilleur choix.
-extract=$HOME/Downloads/nvidia_installers
Le message d'erreur
Mais comment fonctionne le message d'erreur
"ERROR: extract: path must be absolute."
?
s'intégrer dans tout cela?
Nous savons que le tilde n'a pas été élargi. Cela signifie que le programme a obtenu le texte de l’argument incluant le ~
, mais sans le /home/auser
comme chemin. Ce chemin est ~/Downloads/nvidia_installers
- mais maintenant il n'y a pas de shell, le tilde n'a donc aucune signification particulière. C'est juste un nom de répertoire normal. Et comme tout autre chemin de la forme foo/bar/baz
, c'est un chemin relatif
Autres utilisations
S'il y a des caractères après le ~
, comme dans ~alice
- avec toutes les autres règles ci-dessus qui s'appliquent - et s'il y a un nom d'utilisateur alice
, celui-ci est étendu au répertoire de base de alice
, disons home/alice
.
En outre, si vous êtes bob
, ~
élargirait /home/bob
et ~bob
étendrait au même.
La variante ~+
est étendue au répertoire en cours,$PWD
Pour faire référence au répertoire précédent, où vous étiez avant le dernier cd
, vous pouvez utiliser ~-
, qui est développé $OLDPWD
.
Si vous utilisez pushd
et popd
, au lieu de cd
, vous saurez déjà que la pile de répertoires est accessible comme ~-2
.
Détails
Tous les cas où ~
est étendu à un chemin sont manipulés par le shell . Pour d'autres programmes,~
c'est juste un caractère de nom de fichier normal.
Pour la définition exacte à l’intérieur du shell, voici la section pertinente de
Remarquez que le remplacement par n'est qu'un cas particulier parmi de nombreux cas: "Si ce nom de connexion est la chaîne vide, le tilde est remplacé par la valeur du paramètre de shell 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.