J'essaie d'extraire les différentes parties du programme d'installation de la bibliothèque Nvidia cuda. J'utilise la commande suivante:
mkdir ~/Downloads/nvidia_installers
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
Et je reçois le message suivant:
ERROR: extract: path must be absolute.
Et lorsque je tape la commande avec l'adresse littérale de mon domicile, cela fonctionne parfaitement.
./cuda_6.5.14_linux_64.run -extract=/home/likewise-open/XXX/username/Downloads/nvidia_installers
Je suis confus ne devrait pas être ~ identique à/home/likewise-open/XXX/nom d'utilisateur?
Testé:
./cuda_6.5.14_linux_64.run -extract=$HOME/Downloads/nvidia_installers
et cela fonctionne, mais je ne sais pas pourquoi il ne permet pas ~
Bash ne développe un ~ que s'il s'agit du début d'un mot. Vous pouvez le voir entre les commandes suivantes:
$ echo -extract=~/test
-extract=~/test
oli@bert:~$ echo -extract ~/test
-extract /home/oli/test
Bash recherche les caractères autonomes ~
et ~/
pour cette substitution. Aucune autre combinaison ou version citée ne fonctionnera.
$HOME
fonctionne car les substitutions de variables sont plus robustes (le $
est un caractère spécial alors que ~
l’est beaucoup moins):
$ echo Thisisastring${HOME}awrawr
Thisisastring/home/oliawrawr
Alors que nous parlons de ~
, il a encore deux autres utilisations de substitution:
~+
le répertoire de travail en cours (extrait de $PWD
)~-
le répertoire de travail précédent (lu à partir de $OLDPWD
)Comme avec plain ~
, des chemins supplémentaires peuvent être ajoutés à la fin, et là encore, ils doivent être le préfixe d'un mot ou Bash les ignorera.
Vous pouvez en savoir plus à ce sujet dans man bash | less -p ' Tilde'
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 ~
, car elle fonctionne plutôt avec $HOME
.
Le problème: ~
est uniquement 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 au lieu de ~
est la solution la plus propre.
echo -extract=$HOME/Downloads
Ce que vous devriez savoir:
Il existe des cas spéciaux où ~
get est développé lorsqu'il ne se trouve pas au début d'un mot: dans le cadre d'une affectation de variable, directement 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 variable, ~
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
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 Shell.
Il ne peut pas être utilisé comme un chemin en général, le Shell le "développant" en chemin uniquement dans des endroits très spéciaux.
Et même s’il est étendu, il peut s’agir de quelque chose d’autre que le répertoire de base.
:
ou =
$HOME
s'il n'y a aucun autre caractère dans le mot avant un /
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 être de faire du tilde le premier caractère non cité entre un mot, sans autre caractère avant le prochain /
- 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 $HOME
à la place. Dans un script, c'est généralement le meilleur choix.
-extract=$HOME/Downloads/nvidia_installers
Mais comment le message d'erreur"ERROR: extract: path must be absolute."
?
s'inscrit 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’ya pas de shell, le tilde n’a donc aucune signification particulière. C'est juste un nom de répertoire normal. Et comme tous les autres chemins de la forme foo/bar/baz
, il s’agit d’un chemin relatif.
S'il existe des caractères après le ~
, comme dans ~alice
- avec toutes les autres règles susmentionnées - et qu'il existe un nom d'utilisateur alice
, celui-ci est développé dans le répertoire de base de alice
à la place, par exemple home/alice
.
En outre, si vous êtes bob
, ~
serait étendu à /home/bob
et ~bob
serait étendu au même.
La variante ~+
est développée dans le répertoire actuel, $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é en $OLDPWD
.
Si vous utilisez pushd
et popd
au lieu de cd
, vous savez déjà que la pile de répertoires est accessible comme ~-2
.
Tous les cas où ~
est développé en chemin sont gérés par le shell . Pour les autres programmes, ~
est simplement un caractère de nom de fichier normal.
Pour la définition exacte à l'intérieur du shell, voici la section pertinente de man bash
Remarquez que le remplacement de ~
par $HOME
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 Shell 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.
~
n'est pas un chemin en soi. C'est un caractère qui reçoit un traitement spécial de la part du shell, où ~
ou ~/
signifie "remplacer par le chemin du répertoire de base de l'utilisateur actuel". ~username
signifie "remplacer par le chemin du répertoire de départ du nom d'utilisateur".
Comme il ne s'agit pas d'un chemin, il est uniquement reconnu à certains endroits de la commande (en tant que premier caractère d'un nouveau jeton de division d'espace).
Une fois développé, il a été remplacé par un chemin absolu.
L'utilisation de $HOME
fonctionne car HOME est juste une variable définie par le shell et suit les règles normales du shell pour le remplacement des variables (cela se produit avant que l'entrée ne soit fractionnée sur des espaces et exécutée).
Vous avez raison. le ~/Téléchargements est identique à/home/nom d'utilisateur/Téléchargements.
Certains installateurs et extracteurs sont juste très pointilleux sur l'endroit où il faut mettre les choses. Je pense que cela pourrait être dû au fait qu'il enregistre les chemins de fichiers et que les journaux n'acceptent pas ~ dans un chemin accepté.
Je viens juste de prendre l'habitude de taper/home/nom d'utilisateur à la place. :)