#1 Le 18/03/2007, à 02:03
- Cyman
[RESOLU] Manipuler le résultat d'une commande
Salut,
C'est sans doute la question bête du jour mais je n'arrive pas à trouver une réponse convenable ni sur le forum ni ailleurs. Et comme je débute en matière de script. Je voudrais créer un bash qui, lancé au démarrage du PC, ferait:
1- Récupérer les identifiants de mes cartes son (surtout d'une en fait)
2- Ecrire dans un fichier l'identifiant de la carte son à utiliser par défaut.
Mon but est d'automatiser une séquence de commandes shell que je fais presque à chaque démarrage pour que ce soit ma Creative plutot que la carte son intégrée de ma carte mère qui soit utilisée:
"aplay -l" -> me permet de voir quel est l'ID attribué aux cartes pour la session ouverte
"kate /etc/asound.conf" -> édition du fichier qui contient les paramètres sont à utiliser.
Je cherche à l'automatiser car les ID changent à chaque démarrage et je commence à être ulcérée de devoir à chaque fois refaire la manip manuellement.
J'ai trouvé comment récuperer le résultat de "aplay -l" dans une variable mais je n'arrive pas à trouver avec quoi (awk?sed? expr? autre chose?) extraire uniquement une ligne du texte et la parcourir pour récupérer l'identifiant.
Pour le reste (ouverture du fichier .conf en su, écriture) je pense pouvoir me dépatouiller mais je suis également preneuse de tous les conseils!
Aussi, peut être qu'un script bash n'est pas la meilleure solution, j'ai vu qu'on pouvait aussi faire du python, du ruby, etc...
Merci pour votre aide
Cyman
Dernière modification par Cyman (Le 14/05/2007, à 04:48)
Hors ligne
#2 Le 18/03/2007, à 09:39
- rakeen
Re : [RESOLU] Manipuler le résultat d'une commande
Salut
Tu n'as pas besoin de lancer un shell au démarrage pour ca. Pour faire en sorte que ta creative soit utilisée par défaut au démarrage d'ubuntu, il faut lui donner l'index 0 dans le fichier /etc/modprobe.d/alsa-base
Edites le fichier suivant :
sudo gedit /etc/modprobe.d/alsa-base
et ajoutes ceci à la fin du fichier, en ajustant les paramètres pour ta config:
options <module alsa utilisé par ta creative> index=0
options <module alsa utilisé par ta carte intégrée> index=1
Par exemple, dans mon cas, j'ai une carte son intégrée à la carte mère (chipset intel) et une carte son Echo Mia midi donc si je veux que ma Mia soit la carte son par défaut je paramètre le fichier comme indiqué ci-dessous :
options snd_mia index=0
options snd_intel8x0 index=1
Pour connaitre le nom des modules utilisés par tes cartes sons :
http://www.alsa-project.org/alsa-doc/
Choisis le nom du fabricant de ta carte son dans la liste et la colonne "driver" t'indiques le module à utiliser.
@+
Non, non mon prénom c'est pas Kareen ! Grrr
Hors ligne
#3 Le 18/03/2007, à 10:39
- Cyman
Re : [RESOLU] Manipuler le résultat d'une commande
Merci rakeen,
j'essaie ça pour régler ce petit souci. Mais je voudrais tout de même faire ce script histoire d'apprendre à en faire. Si toi ou quelqu'un d'autre pouvait teépondre à ma question ce serait un grand pas pour moi.
Cyman
Hors ligne
#4 Le 18/03/2007, à 19:06
- JoelS
Re : [RESOLU] Manipuler le résultat d'une commande
Merci rakeen,
j'essaie ça pour régler ce petit souci. Mais je voudrais tout de même faire ce script histoire d'apprendre à en faire. Si toi ou quelqu'un d'autre pouvait teépondre à ma question ce serait un grand pas pour moi.
En fait, le meilleur outil dépend du résultat retourné par ta commande. Si la chaine est simple et que les éléments sont séparés par le même caractère, tu peux la découper rapidement avec cut. Sinon une expression régulière à la sed peut faire l'affaire. Si il y a un petit traitement à faire dessus, genre utiliser plusieurs éléments dans un même texte pour sortir l'état voulu, awk est pas mal. Ensuite, il faut passer à plus costaud, genre perl, voire python (mais perl est quand même plus adapté que python pour faire ça).
Si tu veux plus d'info, dis nous ce que te retournes ta commande et si t'as déjà essayé quelque chose.
Hors ligne
#5 Le 18/03/2007, à 23:19
- Cyman
Re : [RESOLU] Manipuler le résultat d'une commande
La commande me retourne un pavé de texte pas si simple à manipuler pour mes piètres connaissances
**** Liste des PLAYBACK périphériques ****
carte 0: nForce2 [NVidia nForce2], périphérique 0 : Intel ICH [NVidia nForce2]
Sous-périphériques: 1/1
Sous-périphérique: #0: subdevice #0
carte 0: nForce2 [NVidia nForce2], périphérique 2 : Intel ICH - IEC958 [NVidia nForce2 - IEC958]
Sous-périphériques: 1/1
Sous-périphérique: #0: subdevice #0
carte 2: Live [SB Live 5.1], périphérique 0 : emu10k1 [ADC Capture/Standard PCM Playback]
Sous-périphériques: 31/32
Sous-périphérique: #0: subdevice #0
Sous-périphérique: #1: subdevice #1
Sous-périphérique: #2: subdevice #2
Sous-périphérique: #3: subdevice #3
Sous-périphérique: #4: subdevice #4
Sous-périphérique: #5: subdevice #5
Sous-périphérique: #6: subdevice #6
Sous-périphérique: #7: subdevice #7
Sous-périphérique: #8: subdevice #8
Sous-périphérique: #9: subdevice #9
Sous-périphérique: #10: subdevice #10
Sous-périphérique: #11: subdevice #11
Sous-périphérique: #12: subdevice #12
Sous-périphérique: #13: subdevice #13
Sous-périphérique: #14: subdevice #14
Sous-périphérique: #15: subdevice #15
Sous-périphérique: #16: subdevice #16
Sous-périphérique: #17: subdevice #17
Sous-périphérique: #18: subdevice #18
Sous-périphérique: #19: subdevice #19
Sous-périphérique: #20: subdevice #20
Sous-périphérique: #21: subdevice #21
Sous-périphérique: #22: subdevice #22
Sous-périphérique: #23: subdevice #23
Sous-périphérique: #24: subdevice #24
Sous-périphérique: #25: subdevice #25
Sous-périphérique: #26: subdevice #26
Sous-périphérique: #27: subdevice #27
Sous-périphérique: #28: subdevice #28
Sous-périphérique: #29: subdevice #29
Sous-périphérique: #30: subdevice #30
Sous-périphérique: #31: subdevice #31
carte 2: Live [SB Live 5.1], périphérique 2 : emu10k1 efx [Multichannel Capture/PT Playback]
Sous-périphériques: 8/8
Sous-périphérique: #0: subdevice #0
Sous-périphérique: #1: subdevice #1
Sous-périphérique: #2: subdevice #2
Sous-périphérique: #3: subdevice #3
Sous-périphérique: #4: subdevice #4
Sous-périphérique: #5: subdevice #5
Sous-périphérique: #6: subdevice #6
Sous-périphérique: #7: subdevice #7
carte 2: Live [SB Live 5.1], périphérique 3 : emu10k1 [Multichannel Playback]
Sous-périphériques: 1/1
Sous-périphérique: #0: subdevice #0
Pour l'instant mon bash a cette tête là:
#!/bin/bash
#This script selects the default sound card at each start up of the computer
DEFAULTCARD="SB"
#Read the sound cards ID
#Live [SB Live 5.1]
cardlist=`aplay -l`
echo "$cardlist"
exit 0
#Affect the default card to the system
Ce que je voudrais faire ensuite c'est récupérer la première ligne ou apparait la carte SB et ensuite récupérer l'ID attribuée à cette carte. Mais je bloque sur l'extraction de la ligne. JoelS, tu parles de awk et de sed, peux-tu m'indiquer des liens vers des tuto pour ces deux "trucs" qui décriraient les différentes fonctions que l'on peut utiliser. Ce que j'ai trouvé via Google ne m'a pas beaucoup aidée...:|
Hors ligne
#6 Le 19/03/2007, à 20:55
- JoelS
Re : [RESOLU] Manipuler le résultat d'une commande
Ce que je voudrais faire ensuite c'est récupérer la première ligne ou apparait la carte SB et ensuite récupérer l'ID attribuée à cette carte.
Ca doit faire l'affaire:
aplay -l | sed -n -e 's/^carte *\([0-9]\).*/\1/' -e '/^[0-9]$/p'
Je te laisse chercher ce que ça veut dire :-) Naan, si tu veux des explications je t'en donnerai :-()
Mais je bloque sur l'extraction de la ligne. JoelS, tu parles de awk et de sed, peux-tu m'indiquer des liens vers des tuto pour ces deux "trucs" qui décriraient les différentes fonctions que l'on peut utiliser. Ce que j'ai trouvé via Google ne m'a pas beaucoup aidée...:|
De bonnes ressources Web sur sed et awk, hélas je ne sais pas. Pour moi, le meilleur tutorial pour sed est le bouquin d'O'Reilly sur sed et awk. Il existe en français, et est vraiment excellent pour la partie sed. A la place de awk, je préfère utiliser Perl, beaucoup beaucoup plus puissant, donc ça m'intéresse moins de maitriser awk. Par contre je pense qu'il est intéressant d'en faire un peu avant de passer à Perl.
Hors ligne
#7 Le 20/03/2007, à 21:24
- tekman54000
Re : [RESOLU] Manipuler le résultat d'une commande
sed... qu'est ce que c'est beau cette syntaxe quand meme...lol ca fait un peu penser au super raccourcis intuitifs d'emacs du style ctrl x ctrl q lol
------------------------------------------------------------------------------------------------
"The day Microsoft makes something that doesn’t suck is probably the day they start making vacuum cleaners" Ernst Jan Plugge
------------------------------------------------------------------------------------------------
Hors ligne
#8 Le 22/03/2007, à 22:44
- JoelS
Re : [RESOLU] Manipuler le résultat d'une commande
sed... qu'est ce que c'est beau cette syntaxe quand meme...lol ca fait un peu penser au super raccourcis intuitifs d'emacs du style ctrl x ctrl q lol
En ce qui concerne les regexp, le principe et la notation est issue de travaux mathématiques datant des années 40 sur la théorie des automates et des langages formels. C'est d'ailleurs ce qui rend les regexp si puissantes et solides, le faite que la fondation est basée sur des maths et non pas une simple syntaxe absconde. Comme toute notation mathématique, l'expression est puissante mais demande beaucoup de maîtrise. cf http://fr.wikipedia.org/wiki/Expression … li%C3%A8re
Pour les commandes Emacs, c'est une autre histoire :-)
Hors ligne
#9 Le 14/05/2007, à 03:46
- Cyman
Re : [RESOLU] Manipuler le résultat d'une commande
Bon, après avoir abandonné le sujet quelques temps, je suis revenue dessus et j'ai réussi à écrire ce fameux script qui configure automatiquement la carte son à utiliser. C'est pas la méthode la plus propre (les variables CONF_PARTX...) mais ça marche et surtout, j'y ai pas passé 20ans!
#!/bin/bash
#SoundCardConf.sh
#This script sets the default sound card
########### -- PERMANENT VARIABLES -- ###########
DEFAULTCARD="SB Live 5.1"
CONF_TMP=/tmp/sound.conf
CONF_FILE=/etc/asound.conf
CONF_PART1="pcm.!default
{
type hw
card "
CONF_PART2="}
ctl.!default
{
type hw
card "
CONF_PART3="}"
################### -- CODE -- ###################
#STEP 1: Read default card ID
#STEP 1.1: Read sound cards IDs
cardlist=`aplay -l`
#echo "Sound cards configuration result: "
#echo "$cardlist"
#STEP 1.2: Look for default card ID
echo "Looking for default card ID..."
sbline=`aplay -l|grep -m 1 "$DEFAULTCARD"`
#echo "$sbline"
position=`expr index "$sbline" :`
let "position=$position-2"
cardID=${sbline:position:1}
echo "Card ID=" "$cardID"
#STEP 2: Modify asound.conf file with the right ID
#STEP 2.1: set new configuration file correct value
conf_content=$CONF_PART1$cardID$CONF_PART2$cardID$CONF_PART3
#STEP 2.2: replace existing configuration file with the new one
#create configuration file
echo "Creating new configuration file..."
echo "$conf_content" >> $CONF_TMP
#temp=`cat "$CONF_TMP"`
#echo "temp file content" "$temp"
sudo mv $CONF_TMP $CONF_FILE
echo "Configuration done"
exit 0
Seul bémol à apporter à ma bidouille: pour une raison que j'ignore, le script n'est pas exécuté au démarrage. (j'ai suivi le tuto : http://jul.is.a.n0life.org/blog/post/20 … -la-Debian).
Mais en fait, je ne suis pas sûre qu'il ne s"exécute pas (et je ne sais pas comment le vérifier). Plusieurs questions me traversent l'esprit:
- Est-il possible qu'il soit exécuté mais trop tôt par exemple? Et donc il resterait sans effet? Parce qu'un fois le PC lancé, plus aucun souci pour le lancement en console.
- Egalement (surement le plus probable), lancé depuis une console, il faut rentrer le password root manuellement, est-il possible que parce qu'au démarrage ce password n'est pas donné, cela ne fonctionne pas? Je n'ai rien trouvé comme info à ce sujet et tous ceux qui utilisent sudo dans des scripts au démarrage semblent ne pas avoir rencontré ce souci.
Bref, si quelqu'un a une idée... J'achète!
EDIT: en cherchant un peu plus, j'ai finalement trouvé la solution pour l'exécution au démarrage. Il suffisait d'ajouter le script dans /etc/rc.local qui ressemble donc à ça maintenant:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/etc/init.d/SoundCardConf.sh
exit 0
Dernière modification par Cyman (Le 14/05/2007, à 04:47)
Hors ligne