lanceur pour retirer sans risque une clé usb
6 jours plus tard
- Modifié
Bonjour kamaris,kamaris a écritJe ne sais pas si tu as vu, j'utilise un nom de clé pour le notify-send dans la fonction power_off() de mon script : c'est le champ MODEL de lsblk.
Dans un petit script d'essai autour de ton travail, j'ai vainement essayé de définir une variable $model en partant de la ligne de script que tu as eu la gentillesse d'écrire (post #13).
J'ai notamment essayé :
model=$(lsblk -no model "$2" | tr '_' ' ')
mais, lorsque je l'introduis ensuite dans la ligne de commande de notify-send en écrivant :model=$(lsblk -no model "$2")
notify-send "summary" -t 10000 '$model'
, j'ai ce message d'erreur :jlfh0816 @ Voyager1804 ~/.scripts
└─ $
./essai.sh
lsblk: : n'est pas un périphérique bloc
Est-ce que tu pourrais me dire comment définir $model de telle sorte que je puisse ensuite l'utilser dans la ligne de commande de notify-send ?Ou alors faut-il impérativement définir $model à l'intérieur d'une fonction power off () comme tu l'as fait dans ton script ?
Ou alors est-ce lsblk qui ne peut être appelé comme je le fais ?
Je te remercie par avance de ton aide !
- Modifié
Merci beaucoup MicP de ta réponse.
J'ai donc remplacé $2 par /dev/sdb mais ça ne supprime pas le message d'erreur relatif à lsblk :

Même résultat en mettant sdb1 au lieu de sdb.
Je suis retourné voir le script de kamaris et je ne vois pas trop à quel endroit $2 est définie ?
Autre chose : lorsque dans mon script j'ajoute un
J'ai donc remplacé $2 par /dev/sdb mais ça ne supprime pas le message d'erreur relatif à lsblk :
jlfh0816 @ Voyager1804 ~/.scripts
└─ $
./essai.sh
lsblk: /dev/sdb : n'est pas un périphérique bloc
Le message de notification qui s'affiche malgré tout montre que le body est constitué par l'expression littérale de $model :
Même résultat en mettant sdb1 au lieu de sdb.
Je suis retourné voir le script de kamaris et je ne vois pas trop à quel endroit $2 est définie ?
Autre chose : lorsque dans mon script j'ajoute un
echo $model
rien ne s'affiche dans le terminal ...Il faut passer à lsblk un nom de périphérique valide.
Pour voir tes noms de périphériques, regarde le retour de lsblk dans le terminal (première colonne).
Dans mon script, le $2 (second argument) de la fonction power_off() correspond à $last_device dans le corps le script, car j'appelle la fonction par
Ton corps de message contient littéralement $model au lieu de sa valeur, car tu as utilisé des guillemets simples au lieu des doubles :
Pour voir tes noms de périphériques, regarde le retour de lsblk dans le terminal (première colonne).
Dans mon script, le $2 (second argument) de la fonction power_off() correspond à $last_device dans le corps le script, car j'appelle la fonction par
power_off "$1" "$last_device"
où $1 est le premier argument du script (l'option éventuelle -v), également passé en premier argument à power_off().Ton corps de message contient littéralement $model au lieu de sa valeur, car tu as utilisé des guillemets simples au lieu des doubles :
notify-send "summary" -t 10000 '$model'
au lieu de
notify-send "summary" -t 10000 "$model"
- Modifié
@kamaris
Merci beaucoup de ta patience pour toutes ces explications !

En fait, cette histoire de guillemets pour le corps du message n'est pas claire car j'ai remarqué (à plusieurs reprises) que, lorsqu'il n'y a pas variable, il lui arrive de ne s'afficher que s'il est entouré de guillemets simples. Par contre, effectivement, lorsque ce corps de message doit afficher la valeur d'une variable, il nécessite des guillemets doubles.
Difficile à comprendre ...
Bon, j'ai largement de quoi potasser les manuels de bash script !!!
Encore merci de ta patience kamaris ... et à toi aussi MicP !
edit: je viens de comprendre pour $2 avant $1 : en fait, c'est dans la déclaration de la fonction que j'avais cette impression car, dans le fil du script ensuite, $1 est bien avant $2.... désolé de ne pas avoir saisi tout de suite ! :rolleyes:
Merci beaucoup de ta patience pour toutes ces explications !

C'est tout bon maintenant en précisant /dev/sdb dans mon petit script :kamaris a écritIl faut passer à lsblk un nom de périphérique valide.
Pour voir tes noms de périphériques, regarde le retour de lsblk dans le terminal (première colonne).
model=$(lsblk -no model /dev/sdb)
echo $model
notify-send "summary" -t 10000 "$model"
- l'echo me retourne bien Cruzer Blade (c'est le modèle de ma clef usb) :jlfh0816 @ Voyager1804 ~/.scripts
└─ $
./essai.sh
Cruzer Blade
- et le message de notification m'affiche bien également Cruzer Blade :
Oui, tu as tout à fait raison, j'aurai dû mieux vérifier ma syntaxe.kamaris a écritTon corps de message contient littéralement $model au lieu de sa valeur, car tu as utilisé des guillemets simples au lieu des doubles
En fait, cette histoire de guillemets pour le corps du message n'est pas claire car j'ai remarqué (à plusieurs reprises) que, lorsqu'il n'y a pas variable, il lui arrive de ne s'afficher que s'il est entouré de guillemets simples. Par contre, effectivement, lorsque ce corps de message doit afficher la valeur d'une variable, il nécessite des guillemets doubles.
Difficile à comprendre ...
Alors là, pour le béotien que je suis, j'avoue ne pas avoir tout compris car si j'ai bien repéré $1 dans ton script ... il apparaît après l'utilisation de $2 (c'est normal ?).kamaris a écritDans mon script, le $2 (second argument) de la fonction power_off() correspond à $last_device dans le corps le script, car j'appelle la fonction paroù $1 est le premier argument du script (l'option éventuelle -v), également passé en premier argument à power_off().power_off "$1" "$last_device"
Bon, j'ai largement de quoi potasser les manuels de bash script !!!

Encore merci de ta patience kamaris ... et à toi aussi MicP !
edit: je viens de comprendre pour $2 avant $1 : en fait, c'est dans la déclaration de la fonction que j'avais cette impression car, dans le fil du script ensuite, $1 est bien avant $2.... désolé de ne pas avoir saisi tout de suite ! :rolleyes:
En fait, quand on écrit une ligne de commande, il faut toujours penser qu'il y a deux étapes :jlfh0816 a écritEn fait, cette histoire de guillemets pour le corps du message n'est pas claire car j'ai remarqué (à plusieurs reprises) que, lorsqu'il n'y a pas variable, il lui arrive de ne s'afficher que s'il est entouré de guillemets simples. Par contre, effectivement, lorsque ce corps de message doit afficher la valeur d'une variable, il nécessite des guillemets doubles.
Difficile à comprendre ...
- l'interprétation de cette ligne de commande par le shell ;
- l'interprétation des arguments de cette ligne de commande par la commande concernée (ici notify-send).
Ce que reçoit la commande invoquée n'est donc pas ce qui est écrit, mais ce qui sort de l'interprétation de ce qui est écrit par le shell.
Voir la section « Simple Command Expansion » de man bash pour un exposé synthétique de cette interprétation.
Concernant les guillemets, le shell les retire (quote removal) en développant ou pas les variables qu'ils contiennent selon qu'il s'agit de guillemets doubles ou simples.
Un bon moyen de voir à quoi ressemble la commande effectivement lancée, est d'utiliser set -x (cf. help set).
Rq : ces $1 et $2 sont à ne pas confondre avec les $1 et $2 dansjlfh0816 a écritedit: je viens de comprendre pour $2 avant $1 : en fait, c'est dans la déclaration de la fonction que j'avais cette impression car, dans le fil du script ensuite, $1 est bien avant $2.... désolé de ne pas avoir saisi tout de suite ! :rolleyes:
done < <(lsblk -Ppno kname,pkname,hotplug,mountpoint \
| awk '{for (i=1;i<=NF;i++) gsub("[^\"]+=\"|\"","",$i)}
(+$3 || p) && $4{print $1" "$2; p=0; next}
+$3 && $2{p=1; next} {p=0}')
car là, ça désigne des champs dans awk, ce qui est encore autre chose ! 
@kamaris
Que dire devant tant de pédagogie, de patience et de bienveillance .... si ce n'est un grand merci !
Bon, dans la pratique, je prendrai quand même deux comprimés d'aspirine avant de me plonger dans les méandres des manuels de bash/shell : on n'est jamais assez prudent !
Et de toute façon, il faudra que je m'en trouve en français si possible, ce sera nettement plus constructif et agréable pour tenter de saisir toutes ces subtilités de syntaxe...
Que dire devant tant de pédagogie, de patience et de bienveillance .... si ce n'est un grand merci !

Bon, dans la pratique, je prendrai quand même deux comprimés d'aspirine avant de me plonger dans les méandres des manuels de bash/shell : on n'est jamais assez prudent !
Et de toute façon, il faudra que je m'en trouve en français si possible, ce sera nettement plus constructif et agréable pour tenter de saisir toutes ces subtilités de syntaxe...
De rien 
Un lien pour les pages de man en français : https://man.developpez.com/manpage-complet/
Et notamment : https://man.developpez.com/man1/bash/

Un lien pour les pages de man en français : https://man.developpez.com/manpage-complet/
Et notamment : https://man.developpez.com/man1/bash/