Donner la valeur /dev/sdx à une variable Le sujet est résolu

Tout ce qui concerne la programmation.
Répondre
tony
Membre actif
Membre actif
Messages : 517
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

salut,
je ne sais pas par quel bout prendre ce problème très simple: éjecter proprement un disque usb externe.
J'ai écrit un script pour rendre automatique sa déconnexion, pour qu'une fois démonté on lui coupe l'alimentation "proprement" lorsque "Éjecter en toute sécurité" n'est pas disponible par un clic droit. Donc:

Code : Tout sélectionner

#!/bin/bash

# Definition de la fonction pod= power-off_device

pod()
{
lsblk
read -p "x :" x
udisksctl power-off -b $x
}
fonctionne très bien si, une fois le disque identifié, j'entre la valeur x= /dev/sda par exemple. J'aimerais entrer seulement la partie "sda", le script modifiant lui-même cette valeur. J'ai donc défini une variable intermédiaire y, mais ça ne lui plaît pas. Il y a donc une règle que je ne respecte pas, mais laquelle?

Code : Tout sélectionner

lsblk
y=/dev/x
read -p "x :" x

udisksctl power-off -b $y

x :sda
Error looking up object for device sda
Debian Trixie/ Xfce
Avatar de l’utilisateur
diesel
Membre
Membre
Messages : 355
Inscription : 29 oct. 2022, 22:43
Status : Hors-ligne

y="/dev/"$x

Et si, dans ton premier script, tu faisais "lsblk -p" au lieu de simplement "lsblk" ?

Amicalement.

Jean-Marie
tony
Membre actif
Membre actif
Messages : 517
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

pas mieux, même erreur. Après avoir corrigé ma bévue récurrente, confondre x en math et $x en bash, j'ai essayé d'échapper les caractères spéciaux "/", sans succès:

Code : Tout sélectionner

y="\/\dev\/\$x" ou y="\/\dev\/\"$x
PS: je viens de tester l'option -p: elle me permettrait de faire un CC, ce qui serait intéressant dans le cas d'un chemin compliqué, non?
Debian Trixie/ Xfce
Avatar de l’utilisateur
diesel
Membre
Membre
Messages : 355
Inscription : 29 oct. 2022, 22:43
Status : Hors-ligne

Code : Tout sélectionner

jean-marie@jean-marie:~$ x="sda"
jean-marie@jean-marie:~$ y="/dev/"$x
jean-marie@jean-marie:~$ echo $y
/dev/sda
jean-marie@jean-marie:~$
Le problème n'est pas là.

Amicalement.

Jean-Marie
Avatar de l’utilisateur
diesel
Membre
Membre
Messages : 355
Inscription : 29 oct. 2022, 22:43
Status : Hors-ligne

Finalement, je te propose la rédaction suivante :

Code : Tout sélectionner

#!/bin/bash
lsblk
read -p "x :" x
udisksctl power-off -b "/dev/"${x#/dev/}
Amicalement.

Jean-Marie
tony
Membre actif
Membre actif
Messages : 517
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

le script présente toujours la même erreur. On dirait qu'il ne trouve pas le chemin de sda, à moins de le lui indiquer en toute lettre.
Merci pour l'aide, je reprendrai ça plus tard, à tête reposée.

PS: je suis un âne, au moment de le déconnecter je me suis aperçu que j'avais oublié de le monter avant les essais. Pas étonnant qu'il ne le trouve pas!! Je reteste de suite.

Toujours cette erreur, même une fois monté. Je verrai ça plus tard. Je n'ai plus qu'à essayer de comprendre ta syntaxe. En tout cas merci bien.
Debian Trixie/ Xfce
Avatar de l’utilisateur
diesel
Membre
Membre
Messages : 355
Inscription : 29 oct. 2022, 22:43
Status : Hors-ligne

C'est une petite subtilité.

- "/dev/" ajoute "/dev/" devant la valeur renvoyée par la variable x,
- ${x#/dev/} enlève un éventuel "/dev/" frappé devant le sdx de la variable x pendant la saisie.

Ce qui fait que tu peux frapper "sdx" ou "/dev/sdx", ça fonctionnera pareil.

Par contre, ça ne marchera qu'en bash (d'où le shebang). En sh, par exemple, ça ne fonctionnera pas.

Amicalement.

Jean-Marie
tony
Membre actif
Membre actif
Messages : 517
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

j'ai repris tout ça à tête reposée car, en y réfléchissant, quelque chose cloche dans mon explication. Je pensais avoir trouvé mon erreur, ben non finalement, ça n'est pas une histoire de montage. Je n'ai pas réussi à la reproduire. Donc c'est probablement un truc dont j'ai le secret= reproduire 10 fois la même erreur sans m'en rendre compte.

Quelle que soit cette erreur, ma première solution, une fois la variable "x" remplacée par sa valeur $x dans y=/dev/$x, fonctionne. Et comme je comprends ce script, je vais le garder, tout en essayant de
décrypter l'ésotérique "/dev/"${x#/dev/}

PS: j'ai fini par trouver, dans un cours sur Bash, la signification de la dernière partie ${..}= modificateur de chaîne du type ${paramètre#modèle}. Je laisse ça aux spécialistes.
Par contre ${#paramètre} couplée avec la commande echo pourrait m'être utile....si je ne l'oublie pas!
Debian Trixie/ Xfce
Avatar de l’utilisateur
diesel
Membre
Membre
Messages : 355
Inscription : 29 oct. 2022, 22:43
Status : Hors-ligne

Pour ton y=/dev/$x, deux erreurs.

1) il manque les "" de chaque côté du /dev/ car les "/" sont interprétés par bash,
2) il est mal placé dans le script. Il doit se trouver après le read, au moment où la variable x a la bonne valeur (et pas avant).

Amicalement.

Jean-Marie
tony
Membre actif
Membre actif
Messages : 517
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

voilà, c'est corrigé.
Merci
Debian Trixie/ Xfce
Répondre