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 ça marche, mais je ne sais pas pourquoi ça ne permet pas ~
command-line
paths
Regan
la source
la source
Réponses:
Bash ne développe un ~ que s'il s'agit du début d'un mot. Vous pouvez le voir entre les commandes suivantes:
Bash recherche les
~
caractères autonomes et~/
cette substitution. Aucune autre combinaison ou version citée ne fonctionnera.$HOME
fonctionne parce que les substitutions de variables sont plus robustes ($
c’est un caractère spécial alors que~
c’est beaucoup moins):Pendant que nous parlons
~
, il a en fait encore deux autres utilisations de substitution:~+
le répertoire de travail actuel (extrait de$PWD
)~-
le répertoire de travail précédent (à lire$OLDPWD
)Comme avec plain
~
, ceux-ci peuvent avoir des chemins supplémentaires ajoutés à la fin, et encore une fois, ceux-ci 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'
la source
zsh
ne (ou plutôt peut être configuré pour) , vous agrandissez~
après=
aussi. Parmi d'autres améliorations pratiques, il a plus de bash.=
; il s’agit d’agrandir au début du côté droit d’une affectation de variable. Cela rend notre cas un peu plus confus quand on regarde de près - voir ma réponse. Etzsh
n'est pas différent debash
cela; La description de 'zsh' est un peu cryptique:info --subnodes zsh | less +/'14.7.4 Notes'
(les pages de manuel de zsh sont manquantes)zsh
est très configurable. Dans mesecho -extract=~/test
résultats zsh dans-extract=/home/user/test
. Il est activé par lesMAGIC_EQUAL_SUBST
options. En passant, toutes les pages de manuel zsh sont correctes.zsh
être configurable - et d'autres améliorations; Je me serais attendu à ce que MAGIC_EQUAL_SUBST (couvert en 14.7.4) soit non défini par défaut et rarement utilisé; Maintenant, c'est évidemment plus pertinent si vous l'avez activé en général. Après avoir obtenu un bon exemple de ma section, cela ferait une belle addition ...Il suffit de le réparer
Cette commande affiche un message d'erreur "ERREUR: extraire: le chemin doit être absolu":
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:
Si vous avez besoin de la syntaxe d'option avec
=
, utiliser $ HOME à la place de~
est la solution la plus propre.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=
.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.
:
ou=
$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 formefoo/bar/baz
, c'est un chemin relatifAutres 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'utilisateuralice
, celui-ci est étendu au répertoire de base dealice
, disonshome/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
etpopd
, au lieu decd
, 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
la source
~
n'est pas un chemin en soi. C'est un personnage qui reçoit un traitement spécial de la part du shell, qui signifie~
ou~/
"remplace par le chemin du répertoire de base de l'utilisateur actuel".~username
signifie "remplacer par le chemin du répertoire personnel 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).
Lorsqu'il est développé, il est remplacé par un chemin absolu.
Utiliser
$HOME
fonctionne parce que 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).la source
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 c'est peut-être parce qu'il enregistre les chemins de fichiers et que les journaux n'acceptent pas ~ dans un chemin accepté.
Je viens de prendre l'habitude de taper / home / nom d'utilisateur à la place. :)
la source