Vous n'êtes pas identifié(e).
Dernière modification par alpha.centauri (16-01-2021 17:52:35)
pb : je crée une variable tata = 'a b'
echo $tata
'a b'
tu es sûr des simples quotes sur la 3e ligne ? Chez moi, ta manip donne
et donc bien sûr le rm $tata échoue comme chez toi avec les mêmes erreurs.
Par contre, rm "$tata" fonctionne :
Toujours penser à mettre des doubles quotes aux variables !
Dernière modification par jpt (14-01-2021 11:03:45)
AMD Ryzen3 3200G sur Gigabyte B450M & Make Love Not War
Hors ligne
pourquoi rm considère séparément 'a et b' plutôt que 'a b' ?
Parce que les variable du shell ne sont pas traitées comme les variables d'un langage de programmation "classique" mais comme de simples éléments de substitution de texte. Si tu connais le langage C, ça ressemblerait plus à une macro #define (traitée par le préprocesseur) qu'à une variable (traitée par le compilateur)
Il vaut mieux montrer que raconter.
Hors ligne
Dernière modification par alpha.centauri (14-01-2021 17:13:13)
effectivement, j'avais constaté que ton rm "$tata" fonctionnait, mais j'aimerais bien comprendre pourquoi mon rm $tata ne marche pas....
Parce que bash commence par remplacer la variable par son contenu avant d'exécuter la commande :
C'est pour cela qu'il est souvent préférable de mettre les variables entre guillemets :
Dernière modification par Beta-Pictoris (14-01-2021 23:02:48)
Hors ligne
Hors ligne
Ce qui aurait été correct ici est :
Pour plus de détails :
En ligne
Je ne connais pas la raison de ce comportement.
Il pourrait l'écrire de cette façon :
Ou comme ceci : (avec un anti slash devant l'espace)
Hors ligne
En mode debug, on voit que Bash fait des transformations bizarres en ajoutant des doubles quotes au début et à la fin :
VAR="'a b'"
+ VAR=''\''a b'\'''
Je ne connais pas la raison de ce comportement.
C'est logique, mais attention, ça va sembler très con (comme tout ce que fait une machine)
Le premier ' est là pour ouvrir une chaîne de caractères, suivi de '\'' pour ajouter un ' littéral, puis "a b", puis un nouveau '\'', puis un ' final pour acherver la chaîne de caractères.
Ce qui devient un peu contre-intuitif quand on décortique '\'' : le premier ' est là pour fermer la chaîne de caractères en cours, \' pour ajouter un ' littéral, puis ' pour rouvrir la chaîne.
Ce qui donne pour une retranscription :
' → on ouvre une chaîne de caractères
' → on ferme une chaîne de caractères
\' → on insère un ' littéral
' → on ouvre une chaîne de caractères
a b → on insère la chaîne "a b"
' → on ferme une chaîne de caractères
\' → on insère un ' littéral
' → on ouvre une chaîne de caractères
' → on ferme une chaîne de caractères
La lecture de ce décortiquage semble inclure des étapes absurdes pour un humain (ouvrir un truc pour le fermer immédiatement), mais dans le cas d'un traitement systématique par une machine c'est en fait logique du début à la fin.
En ligne
Même problème avec des antislash placés devant les quotes.
Le bash fait donc ceci :
Dans des chaînes entres doubles guillemets, quand il y a 2 quotes ou plus, ils sont remplacés chacun par une chaîne constituée d'un quote, un antislash et de 2 quotes : '\''
Et les doubles guillemets sont remplacées par des quotes :
Dernière modification par Beta-Pictoris (15-01-2021 15:05:08)
Hors ligne
Hors ligne