Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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

diesel a écrit :

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

kamaris a écrit :
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é.

kamaris a écrit :

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 big_smile
Et puis au bout du compte, shellcheck ne fait bien sûr que ce qu'il peut…
Fin du plaidoyer pro-shellcheck smile

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

diesel a écrit :

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 ( big_smile ), 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. wink lol

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. wink lol lol lol

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

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 big_smile
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

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. wink lol

Certes big_smile 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 big_smile

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.

yikes Je crois que melixgaro a tout dit big_smile

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 smile

Hors ligne

#35 Le 24/01/2020, à 15:03

diesel

Re : [RESOLU] Forcer l'écriture sur une clé USB

melixgaro a écrit :
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 big_smile
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

kamaris a écrit :
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. wink lol

Certes big_smile 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 big_smile

De toutes manières, j'ai mis en œuvre la recommandation de shellcheck et cela ne risque plus d'arriver.

kamaris a écrit :
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 smile

Oui, c'est vrai. Cela dit, l'analyse et l'extraction (on n'a plus le droit de dire "parser" wink ) 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) wink


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

diesel a écrit :

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

diesel a écrit :

Oui, c'est vrai. Cela dit, l'analyse et l'extraction (on n'a plus le droit de dire "parser" wink ) 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é wink

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" wink smile ).

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