Aide et amélioration concernant un script

Bonjour

Je fais suite à mon problème qui est en partie résolu: mon-micro-casque-reconnu-mais-non-fonctionnel-t42695.html.

Cependant, je suis en train de me faire un script pour semi-automatiser la prise en compte de mon casque usb, voici mon script:

#!/bin/bash
function redemarrage
{
	/etc/init.d/alsa-utils restart
}
toto=$(cat /proc/asound/modules | tail -1);
echo $toto;
if [ "1 snd_usb_audio" = "$toto" ] && [ -f /home/leknopppix/.asoundrc_bak ]
then
	mv /home/leknoppix/.asoundrc_bak /home/leknoppix/.asoundrc
	redemarrage
fi;
if [ "1 snd_usb_audio" = "$toto" ] && [ -f /home/leknopppix/.asoundrc ]
then
	redemarrage
fi;
if  [ "0 snd_hda_intel" = "$toto" ] && [ -f /home/leknopppix/.asoundrc ]
then
	mv /home/leknoppix/.asoundrc /home/leknoppix/.asoundrc_bak
	redemarrage
fi;
if  [ "0 snd_hda_intel" = "$toto" ] && [ -f /home/leknopppix/.asoundrc_bak ]
then
	redemarrage
fi;

Mais le hic, c’est que mon script ne fonctionne pas. Voyez vous pourquoi?
Le bash et moi-même faisons 100.

Merci pour toute l’aide que vous pourriez m’apporter.
leknoppix

Je m’y connais pas en bash, mais connaissant des langages.

Tu peux changer:
cat /proc/asound/modules | tail -1
par
tail -n1 /proc/asound/modules

Sache que dans le début du résultat de cet commande tu as (Normalement) un espace " 1…", donc "1 … " == $toto, ne donnera pas résultat, ajoute un espace devant 1 (ou 0 dans d’autres cas).

Pour faire un “/etc/init.d/alsa-utils restart” il me semble que tu dois posséder les droits root, du coup en utilisateur normal sa finalisera pas la tâche voulu.
Il devrait y avoir une manière de faire fonctionner en utilisateur, n’ayant eu jamais besoin je sais pas comment, mais une idée me dit de faire un exécutable comme les programmes normale et pour cela un piste serait un fichier bin (/usr/bin/tonprogramme) (l’idée semble bonne mais pas sûr s’il fonctionnera ou pas ou si c’est une bonne méthode).

Sinon faire une fonction “redemarrage” n’est pas vraiment nécessaire pour un petit script et tu gagneras plus en performance bien que presque invisible.

Faire un script est une bonne idée, ces derniers jours c’est populaire les sujets sur le son et sa risque de durer.
Un script plus évolué et simple d’utilisateur aurait permis de résoudre tous ces sujets si facilement, dommage que je suis fainéant…

Quand j’exécute le script, je le fais en mode sudo ou root.

leknoppix

Il te faut les droits root.

Root te le permet.
Sudo te le permet, si tu le fais permettre.

Essaye dans les deux cas et tu verras bien.

Ne connaissant pas trop sudo, sudo te permet d’exécuté en droit de root: un application ou plusieurs applications ou tous les applications pour un seul utilisateur ou plusieurs utilisateurs ou tous les utilisateurs. Donc à toi de voir comment tu veux faire.

Salut,

Rien en sortie de script ?
Rien dans les logs ?
Tu as testé les commandes une à une dans une console ?

Bonjour

Alors, un ami m’a un peu plus expliqué comment améliorer mon script et voici le résultat, avec la présence de quelque débug:

#!/bin/bash
toto=$(tail -n1 /proc/asound/modules);
echo $toto;
if [ " 1 snd_usb_audio" = "$toto" ]; then
	echo "casque branché";
        if [ -f /home/leknopppix/.asoundrc_bak ]; then
		echo "Renommage du bak en rien";
                mv /home/leknoppix/.asoundrc_bak /home/leknoppix/.asoundrc && /etc/init.d/alsa-utils restart
        else
		echo "simple redemarrage";
                /etc/init.d/alsa-utils restart
        fi
elif [ " 0 snd_hda_intel" = "$toto" ]; then
	echo "Casque débranché";
        if [ -f /home/leknopppix/.asoundrc ]; then
	echo "Renommage du rien en bak";
                mv /home/leknoppix/.asoundrc /home/leknoppix/.asoundrc_bak && /etc/init.d/alsa-utils restart
        else
                /etc/init.d/alsa-utils restart
        fi
fi

Le seul hic, c’est que je rentre pas dans les bonnes boucles if.
Je m’explique, j’ai mon casque branché, le fichier .asoundrc_bak de brancher, mais impossible de rentrer dans le premiere condition de if [ -f /home/leknopppix/.asoundrc_bak ].

Des idées?

Allo ?! Allo ? Tu m’entends ?! T’es une variable et tu t’appelle « toto » ! Non, mais allo ? Allo, quoi ?! :slightly_smiling:

Plus sérieusement, tu compare avec = au lieu de ==. Évidement une variable qui s’appelle totot ce n’est pas très propre et les chemins de fichiers complets non plus. Tu peut aussi simplifier le programme (quoi qu’il arrive tu redémarre alsa-utils) et je ne connais pas assez /proc/asound/modules pour faire confiance à un tail -n1, avec awk c’est un peu plus sûr. J’ai repris le fonctionnement que tu semblais vouloir mais à mon avis, il vaudrait mieux faire comme dans le second script :

[code]#!/bin/bash

state=$(awk ‘/snd_usb_audio/{print $1}’ /proc/asound/modules);

if [[ “$state” == “1” && -f “${HOME}/.asoundrc_bak” ]]; then
echo "casque branché : Renommage du bak en rien"
mv “${HOME}/.asoundrc_bak” "${HOME}/.asoundrc"
elif [[ “$state” == “0” && -f “${HOME}/.asoundrc” ]]; then
echo "Casque débranché : renommage du rien en bak"
mv “${HOME}/.asoundrc” "${HOME}/.asoundrc_bak"
else
echo "simple redemarrage"
fi
/etc/init.d/alsa-utils restart[/code]

Second :

[code]#!/bin/bash

state=$(awk ‘/snd_usb_audio/{print $1}’ /proc/asound/modules);

if [[ “$state” == “1” && -f “${HOME}/.asoundrc_bak” ]]; then
echo "casque branché : Renommage du bak en rien"
mv “${HOME}/.asoundrc_bak” "${HOME}/.asoundrc"
elif [[ -f “${HOME}/.asoundrc” ]]; then
echo "Casque débranché : renommage du rien en bak"
mv “${HOME}/.asoundrc” "${HOME}/.asoundrc_bak"
else
echo "simple redemarrage"
fi
/etc/init.d/alsa-utils restart[/code]

Mais j’aime pas le fort couplage avec un fichier extérieur, on peut faire mieux (maintenant que j’ai lu ton autre sujet) :

[code]#!/bin/bash

state=$(awk ‘/snd_usb_audio/{print $1}’ /proc/asound/modules);

if [[ “$state” == “1” ]]; then
echo "casque branché : Création du asoundrc"
cat >> “${HOME}/.asoundrc” <<EOF
defaults.ctl.card 1
defaults.pcm.card 1
defaults.pcm.device 0
EOF
else
echo "Casque débranché : Suppression de asoundrc"
rm "${HOME}/.asoundrc"
fi
/etc/init.d/alsa-utils restart[/code]
Comme ça tu n’a plus besoin de fichier extérieur.

L’étape supplémentaire c’est de regarder du coté de udev pour lancer ton script au branchement et débranchement de ton casque de manière automatique. Je te laisse commencé à chercher dans ce sens et n’hésite pas à venir poser des questions si tu es en galère :slightly_smiling:

Merci pour ces codes, je vais essayer de comprendre car il me renvoie tout le temps “simple redémarrage” et ce, quelques soient les cas.

Que je peux être con d’avoir mis “=” plutôt que “==”. Pour les règles udev, je vais regarder, merci.

On fais tous des erreurs qui paraissent bête.

Lance le script avec la commande :

Pour comprendre ce qui se passe.

En principe ça ne peux que venir d’awk. Cette commande te renvoie quoi ?

Sans casque:

leknoppix@debian:~$ bash -x ./script2.sh 
++ tail -n1 /proc/asound/modules
+ toto=' 0 snd_hda_intel'
+ echo 0 snd_hda_intel
0 snd_hda_intel
+ '[' ' 1 snd_usb_audio' == ' 0 snd_hda_intel' ']'
+ '[' ' 0 snd_hda_intel' == ' 0 snd_hda_intel' ']'
+ echo 'Casque débranché'
Casque débranché
+ '[' -f /home/leknoppix/.asoundrc ']'
+ /etc/init.d/alsa-utils restart
Shutting down ALSA...warning: 'alsactl store' failed with error message 'alsactl: save_state:1532: Cannot open /var/lib/alsa/asound.state for writing: Permission denied'...failed.
Setting up ALSA...done.
leknoppix@debian:~$

Avec casque:

[code]leknoppix@debian:~$ bash -x ./script2.sh
++ tail -n1 /proc/asound/modules

  • toto=’ 1 snd_usb_audio’
  • echo 1 snd_usb_audio
    1 snd_usb_audio
  • ‘[’ ’ 1 snd_usb_audio’ == ’ 1 snd_usb_audio’ ‘]’
  • echo 'casque branché’
    casque branché
  • ‘[’ -f /home/leknoppix/.asoundrc_bak ‘]’
  • echo 'Renommage du bak en rien’
    Renommage du bak en rien
  • mv /home/leknoppix/.asoundrc_bak /home/leknoppix/.asoundrc
  • /etc/init.d/alsa-utils restart
    Shutting down ALSA…warning: ‘alsactl store’ failed with error message ‘alsactl: save_state:1532: Cannot open /var/lib/alsa/asound.state for writing: Permission denied’…failed.
    Setting up ALSA…done.[/code]

Et instruction avec le casque renvoie 1, sinon rien.

Donc ça marche bien (même si c’est pas l’un de mes version :slightly_smiling: )

Oui, maintenant, je cherche à comprendre comment fonctionne udev!
Leknoppix

D’après ce que j’ai compris, j’ai récupéré le numéro de serie de mon casque:

Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 002: ID 045e:070f Microsoft Corp.
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 064e:a103 Suyin Corp. Acer/HP Integrated Webcam [CN0314]
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Voici ma règle udev si j’ai compris comment elle fonctionnait:

[code]

Reconnaissance de l’usb casque

SYSFS{idVendor}==“045e”, SYSFS{idProduct}==“070f”, ACTION==“add”, SUBSYSTEMS==“usb”, RUN+="/home/leknoppix/script2.sh"[/code]

Est ce plus ou moins cela? Je n’ai pas compris comment ajouter cette udev, ni où!

Pourriez vous me donner un petit coup de main?

Leknoppix

Dans un fichier de /etc/udev/rules.d/, généralement 10-local.rules.

Le fichier 10-local.rules n’hesite pas dans mon cas, faut-il le créer?

Ouep. D’une manière général les dossiers machin.d sont des dossiers de configuration. Tu y crée autant de fichiers que tu veux qui contiennent un bout de configuration. L’avantage c’est de pouvoir découper ta configuration en plusieurs partie, l’autre énorme avantage c’est qu’ajouter ou retirer les bouts de conf se fait sans risque de problème pour le reste et la mise à jour d’udev (en l’occurrence ne pose pas de problème).

@ MisterFreez, merci pour ton script, impec.

@ leknoppix, elle fonctionne ta règle udev?

Mes règles fonctionnent sans aucun soucis. Le seul truc qu’il ne faut pas que j’oublie, c’est que si le son passe par le navigateur, il faut que je le referme et le redémarre, tout comme avec vlc ou lecteur audio.

leknoppix