#26 Le 22/01/2020, à 18:08
- diesel
Re : [RESOLU] Forcer l'écriture sur une clé USB
Je viens de passer un coup de shellcheck sur mon script. Le résultat ne m'a pas impressionné.
In music_copy.sh line 8:
if [ $1 = "-d" ]
^-- SC2086: Double quote to prevent globbing and word splitting.
In music_copy.sh line 36:
echo "le fichier "$fichier_description" n'existe pas"
^------------------^ SC2027: The surrounding quotes actually unquote this. Remove or escape them.
^------------------^ SC2086: Double quote to prevent globbing and word splitting.
In music_copy.sh line 46:
echo $peripherique_destination" ne désigne pas un périphérique"
^-----------------------^ SC2086: Double quote to prevent globbing and word splitting.
In music_copy.sh line 56:
echo "Le périphérique "$peripherique_destination" n'existe pas"
^-----------------------^ SC2027: The surrounding quotes actually unquote this. Remove or escape them.
^-----------------------^ SC2086: Double quote to prevent globbing and word splitting.
In music_copy.sh line 66:
echo "Le périphérique "$peripherique_destination" n'est pas un périphérique de type bloc"
^-----------------------^ SC2027: The surrounding quotes actually unquote this. Remove or escape them.
^-----------------------^ SC2086: Double quote to prevent globbing and word splitting.
In music_copy.sh line 78:
echo "Le périphérique "$peripherique_destination" n'est pas monté"
^-----------------------^ SC2027: The surrounding quotes actually unquote this. Remove or escape them.
^-----------------------^ SC2086: Double quote to prevent globbing and word splitting.
In music_copy.sh line 84:
musique=$(sed -n -e "s/://" -e "1 p" $fichier_description)
^------------------^ SC2086: Double quote to prevent globbing and word splitting.
In music_copy.sh line 87:
artiste=$(sed -n "$ligne_artiste p" $fichier_description)
^------------------^ SC2086: Double quote to prevent globbing and word splitting.
In music_copy.sh line 92:
while [ ! -z "$artiste" ]
^-- SC2236: Use -n instead of ! -z.
In music_copy.sh line 107:
((ligne_album=$(grep -n "$source_artiste" $fichier_description | cut -d: -f1)+1))
^------------------^ SC2086: Double quote to prevent globbing and word splitting.
In music_copy.sh line 108:
album=$(sed -n "$ligne_album p" $fichier_description)
^------------------^ SC2086: Double quote to prevent globbing and word splitting.
In music_copy.sh line 112:
while [ ! -z "$album" ]
^-- SC2236: Use -n instead of ! -z.
In music_copy.sh line 127:
((ligne_titre=$(grep -n "$source_album" $fichier_description | cut -d: -f1)+1))
^------------------^ SC2086: Double quote to prevent globbing and word splitting.
In music_copy.sh line 128:
titre=$(sed -n "$ligne_titre p" $fichier_description)
^------------------^ SC2086: Double quote to prevent globbing and word splitting.
In music_copy.sh line 135:
while [ ! -z "$titre" ]
^-- SC2236: Use -n instead of ! -z.
In music_copy.sh line 151:
titre=$(sed -n "$ligne_titre p" $fichier_description)
^------------------^ SC2086: Double quote to prevent globbing and word splitting.
In music_copy.sh line 159:
album=$(sed -n "$ligne_album p" $fichier_description)
^------------------^ SC2086: Double quote to prevent globbing and word splitting.
In music_copy.sh line 166:
artiste=$(sed -n "$ligne_artiste p" $fichier_description)
^------------------^ SC2086: Double quote to prevent globbing and word splitting.
For more information:
https://www.shellcheck.net/wiki/SC2027 -- The surrounding quotes actually u...
https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
https://www.shellcheck.net/wiki/SC2236 -- Use -n instead of ! -z.
Néanmoins, j'ai appliqué les corrections proposées.
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 22/01/2020, à 23:21)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#27 Le 22/01/2020, à 18:18
- kamaris
Re : [RESOLU] Forcer l'écriture sur une clé USB
Le résultat ne m'a pas impressionné.
Que veux-tu dire ?
As-tu jeté un coup d'œil aussi aux liens wiki qu'il te donne en fin d'analyse ?
Hors ligne
#28 Le 22/01/2020, à 23:25
- diesel
Re : [RESOLU] Forcer l'écriture sur une clé USB
diesel a écrit :Le résultat ne m'a pas impressionné.
Que veux-tu dire ?
Même si les doubles quote qu'il recommande sont mieux que les miens, ça ne change rien à un script qui fonctionne bien.
Et quant à remplacer ! -z par -n, même si ça fait gagner deux caractères, ça ne change rien au fonctionnement du test concerné.
As-tu jeté un coup d'œil aussi aux liens wiki qu'il te donne en fin d'analyse ?
Non. Je vais aller y voir.
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 22/01/2020, à 23:26)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#29 Le 22/01/2020, à 23:54
- kamaris
Re : [RESOLU] Forcer l'écriture sur une clé USB
Tout ce que relève shellcheck n'a pas le même niveau de gravité, d'où les codes couleur rouge / orange / vert, pour faire le gros du tri, et ensuite il reste divers niveaux dans le vert, jusqu'aux sorties optionnelles.
Concernant la double négation ! -z / -n, c'est effectivement seulement une question de style, mais ça n'est pas parce que ça n'est que cela qu'il est mal que shellcheck le relève.
Pour les guillemets par contre, pas d'accord : ton script ne fonctionne pas bien sans les corrections :
if [ $1 = "-d" ]
sortira en erreur si $1 est vide, et
musique=$(sed -n -e "s/://" -e "1 p" $fichier_description)
sortira en erreur ou aura un comportement non souhaité si $fichier_description contient des espaces, des sauts de ligne, ou des caractères que le shell interprète.
Après, s'il n'y a pas d'erreur plus grave, shellcheck ne va pas non plus les inventer
Et puis au bout du compte, shellcheck ne fait bien sûr que ce qu'il peut…
Fin du plaidoyer pro-shellcheck
Hors ligne
#30 Le 23/01/2020, à 08:51
- diesel
Re : [RESOLU] Forcer l'écriture sur une clé USB
Bonjour Kamaris,
Tu as raison.
Cependant, l'erreur sur le test du premier paramètre n'intervient dans ce cas là uniquement si le script est appelé sans aucun argument, ce qui n'est pas censé arriver. Et même dans ce cas, le comportement du script est correct puisqu'il se termine quand-même après avoir donné la ligne d'usage. Il y a juste le message d'erreur en plus.
De même, pour le fichier de description des répertoires et fichiers à copier, comme ce script est destiné à mon usage personnel, je n'ai jamais envisagé de donner à ce fichier de description un nom avec des espaces.
Par contre, il y a plus grave dans ce script. Et là, shellcheck, dont je reconnais l'utilité et que je vais continuer à utiliser, n'y peut pas grand chose. En effet, le script part du principe que le fichier "fichier_description" est correctement formaté. A la moindre erreur, il y a toutes les chances pour que ça ne donne pas le bon résultat.
Bon, dans ce cas, il n'y a pas péril en la demeure, il suffit de corriger le fichier de description et recommencer.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#31 Le 23/01/2020, à 15:52
- kamaris
Re : [RESOLU] Forcer l'écriture sur une clé USB
Cependant, l'erreur sur le test du premier paramètre n'intervient dans ce cas là uniquement si le script est appelé sans aucun argument, ce qui n'est pas censé arriver. Et même dans ce cas, le comportement du script est correct puisqu'il se termine quand-même après avoir donné la ligne d'usage. Il y a juste le message d'erreur en plus.
Outre le fait que l'argument « ce qui n'est pas censé arriver » est un peu limite ( ), c'est faux : essaie
ton-script '' fichier
Le premier argument est vide, donc on ne rentre pas dans le premier if, donc on ne fait pas le shift, donc il reste deux arguments, donc on ne rentre pas dans le second if, donc on continue…
De même pour le fichier de description, autant adopter les bonnes pratiques et « quoter » les variables, surtout que tu le fais à certains endroits :
if [ ! -f "$fichier_description" ]
Et oui effectivement : une vérification du format de ce fichier de description pourrait être faite.
D'ailleurs, un autre truc qui pourrait être changé : le parsing de ce fichier.
Au lieu de faire de multiples appels de sed, lire le fichier une seule fois avec une boucle while, ou bien utiliser awk, quitte à changer le format du fichier pour qu'il s'y prête mieux (je ne sais pas si c'est nécessaire).
Hors ligne
#32 Le 24/01/2020, à 07:21
- diesel
Re : [RESOLU] Forcer l'écriture sur une clé USB
OUI.
M'enfin, pour lancer le script avec un double simple-quote comme premier argument, t'avoueras qu'il faut être un peu (vachement) vicieux.
Pour le format du fichier, c'est le résultat d'un ls -R et je n'ai pas envie de m'embêter plus que ça. Et je préfère le parser au fur et à mesure plutôt que d'en faire 'une copie' dans des variables.
Et il faudra, un jour, que je m'intéresse à awk.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#33 Le 24/01/2020, à 13:37
- melixgaro
Re : [RESOLU] Forcer l'écriture sur une clé USB
Pour le format du fichier, c'est le résultat d'un ls -R et je n'ai pas envie de m'embêter plus que ça. Et je préfère le parser au fur et à mesure plutôt que d'en faire 'une copie' dans des variables.
On me signale que Watael fait un malaise à la lecture de cette phrase
Sinon, parser n'est pas très joli. En fonction du contexte, y a analyser, décomposer, inspecter, séparer, extraire, morceler, fractionner…
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#34 Le 24/01/2020, à 14:33
- kamaris
Re : [RESOLU] Forcer l'écriture sur une clé USB
OUI.
M'enfin, pour lancer le script avec un double simple-quote comme premier argument, t'avoueras qu'il faut être un peu (vachement) vicieux.
Certes Je m'attendais un peu à cette réponse, car écrit comme c'est en #29, je t'accorde qu'il faut avoir l'esprit mal tourné !
Mais voici une chose qui peut très bien se passer, en revanche :
tu utilises ton script dans un autre script, ou tu le lances simplement depuis le terminal, mais en ayant placé le nom du fichier de description dans une variable ;
pour une raison ou une autre, au moment de lancer le script, cette variable est vide (soit qu'elle a été vidée entre deux, soit que tu as fait une faute de frappe en saisissant son nom au clavier) ;
tu fais
ton-script "$fichier_description" "$peripherique_destination"
et là, c'est le drame
Pour le format du fichier, c'est le résultat d'un ls -R et je n'ai pas envie de m'embêter plus que ça.
Je crois que melixgaro a tout dit
Et je préfère le parser au fur et à mesure plutôt que d'en faire 'une copie' dans des variables.
Mais tu ne le parses pas vraiment au fur et à mesure justement, tu le parses plutôt autant de fois que tu invoques sed.
Faire une boucle « while read…; do… done < "$fichier_description" » pourrait être un moyen de le parser au fur et à mesure, sans en faire une copie dans une variable.
Mais bon ça n'était qu'une remarque en passant, si ça marche comme ça c'est très bien
Hors ligne
#35 Le 24/01/2020, à 15:03
- diesel
Re : [RESOLU] Forcer l'écriture sur une clé USB
diesel a écrit :Pour le format du fichier, c'est le résultat d'un ls -R et je n'ai pas envie de m'embêter plus que ça. Et je préfère le parser au fur et à mesure plutôt que d'en faire 'une copie' dans des variables.
On me signale que Watael fait un malaise à la lecture de cette phrase
Sinon, parser n'est pas très joli. En fonction du contexte, y a analyser, décomposer, inspecter, séparer, extraire, morceler, fractionner…
Je ne suis pas certain qu'il fasse un malaise. Ici, le ls -R n'est pas utilisé pour remplir un indice de boucle ou une variable. Dans ce contexte, je n'ai aucun problème, en particulier, avec les espaces.
Pour moi, parser signifie à la fois analyser et extraire (1 mot pour deux) et je ne connais pas 1 mot français équivalent.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#36 Le 24/01/2020, à 15:13
- diesel
Re : [RESOLU] Forcer l'écriture sur une clé USB
diesel a écrit :OUI.
M'enfin, pour lancer le script avec un double simple-quote comme premier argument, t'avoueras qu'il faut être un peu (vachement) vicieux.
Certes Je m'attendais un peu à cette réponse, car écrit comme c'est en #29, je t'accorde qu'il faut avoir l'esprit mal tourné !
Mais voici une chose qui peut très bien se passer, en revanche :
tu utilises ton script dans un autre script, ou tu le lances simplement depuis le terminal, mais en ayant placé le nom du fichier de description dans une variable ;
pour une raison ou une autre, au moment de lancer le script, cette variable est vide (soit qu'elle a été vidée entre deux, soit que tu as fait une faute de frappe en saisissant son nom au clavier) ;
tu fais
ton-script "$fichier_description" "$peripherique_destination"
et là, c'est le drame
De toutes manières, j'ai mis en œuvre la recommandation de shellcheck et cela ne risque plus d'arriver.
diesel a écrit :Et je préfère le parser au fur et à mesure plutôt que d'en faire 'une copie' dans des variables.
Mais tu ne le parses pas vraiment au fur et à mesure justement, tu le parses plutôt autant de fois que tu invoques sed.
Faire une boucle « while read…; do… done < "$fichier_description" » pourrait être un moyen de le parser au fur et à mesure, sans en faire une copie dans une variable.
Mais bon ça n'était qu'une remarque en passant, si ça marche comme ça c'est très bien
Oui, c'est vrai. Cela dit, l'analyse et l'extraction (on n'a plus le droit de dire "parser" ) se fait à plusieurs endroits du fichier, d'une part dans la liste des artistes au début du fichier et d'autre part dans les listes de titres plus bas et le script passe son temps à "monter" et "descendre" dans le fichier. Je ne vois pas trop comment je pourrais faire en une seule passe sauf à faire une "copie" du fichier dans des variables (ou des tableaux).
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#37 Le 24/01/2020, à 16:40
- melixgaro
Re : [RESOLU] Forcer l'écriture sur une clé USB
Et puis si ton script prend des options, il vaut mieux en passer par getopts ou par un combo « while test -n "${1}" - case - shift » (pour un truc plus artisanal/plus souple)
PS : Désolé d'avoir saoûlé ;-) avec l'anglicisme parser (c'est vrai que ce n'est pas l'anglicisme qui fait le plus saigner les oreilles d'un francophone) mais le ou la lectrice moins au fait de ce vocabulaire ne comprendra pas. D'autant que le mot « analyser » (ou « analyser syntaxiquement » si on veut insister sur l'aspect d'une analyse basée sur la structure intrinsèque du texte en entrée (comme les balises en html/xml)) convient bien et est connu de tous et toutes. Décomposer me paraît même mieux puisque qu'il sous-entend extraire les éléments constitutifs (donc par l'analyse). Bref !
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#38 Le 24/01/2020, à 17:38
- kamaris
Re : [RESOLU] Forcer l'écriture sur une clé USB
Je ne suis pas certain qu'il fasse un malaise. Ici, le ls -R n'est pas utilisé pour remplir un indice de boucle ou une variable. Dans ce contexte, je n'ai aucun problème, en particulier, avec les espaces.
Les espaces ne sont pas le seul problème, il y a aussi par exemple les sauts de ligne, et puis aussi, selon les versions, on ne maitrise pas le format de sortie de ls pour les caractères spéciaux : on avait récemment évoqué le sujet ici (avec divers liens) : https://forum.ubuntu-fr.org/viewtopic.p … #p22204538
Oui, c'est vrai. Cela dit, l'analyse et l'extraction (on n'a plus le droit de dire "parser" ) se fait à plusieurs endroits du fichier, d'une part dans la liste des artistes au début du fichier et d'autre part dans les listes de titres plus bas et le script passe son temps à "monter" et "descendre" dans le fichier. Je ne vois pas trop comment je pourrais faire en une seule passe sauf à faire une "copie" du fichier dans des variables (ou des tableaux).
Oui, ça peut être nécessaire d'en passer par des tableaux en l'occurrence, et ça clarifierait probablement le code en plus de le rendre plus performant, mais bon encore une fois, ça n'était qu'une remarque en passant.
L'essentiel est qu'au final, tu puisses faire de bonnes balades en musique avec ton autoradio + clef usb bien configuré
Hors ligne
#39 Le 24/01/2020, à 18:15
- diesel
Re : [RESOLU] Forcer l'écriture sur une clé USB
Merci à vous pour toutes ces remarques.
C'est comme ça qu'on s'améliore.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#40 Le 25/01/2020, à 11:30
- diesel
Re : [RESOLU] Forcer l'écriture sur une clé USB
Bon, finalement, je vais vous donner raison à tous en simplifiant la chose (en en arrêtant d'utiliser le résultat d'un "ls -R" ).
Mon fichier de description ne contiendra finalement que les noms d'artistes et je vais me débrouiller avec exiftool pour aller chercher directement les infos "album" et "titre" dans les tags des fichiers audio.
L'avantage, c'est que ça me permettra de mettre directement dans l'ordre les albums comportant plusieurs disques.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne