PDA

Afficher la version complète : [Réglé] script bash : appel de fonction entre " pour powersave



ChrisdR
30/06/2007, 13h58
Salut.
Je suis en train de programmer les appels acpi pour mon portable asus.
Je me suis fait un script asus_acpi_event dans /usr/lib/powersave/scripts conformément au manuel de powersave qui gère les appels acpi et en recopiant le fonctionnement de thinkpad_acpi_event .
Dans ce script il y a un fonction run_on_xserver :

run_on_xserver() {
get_x_user
DEBUG "User $X_USER display $DISP $1 " INFO
su $X_USER -c "DISPLAY=$DISP $1"
}

Et dans cette fonction je veux exécuter cette commande (pour programmer une touche raccourci) :

dcop klauncher klauncher 'kdeinit_exec(QString,QStringList)' unison [ ]

Alors bien sûr il faut que cette commande soit entre des guillemets ( " ) pour être appelée par la fonction run_on_xserver :

run_on_xserver "dcop klauncher klauncher 'kdeinit_exec(QString,QStringList)' unison [ ]"
Mais ça marche pas parce qu'il y a des ' , des ( et des , dans les " . Je savais qu'il fallait des \ avant pour que le bash les prenne en compte mais j'ai beau en mettre, ça ne marche pas.
Comment faire ???

Burn2
30/06/2007, 14h00
Bonjours et de cette manière ça ne marche pas?


run_on_xserver \"dcop klauncher klauncher 'kdeinit_exec(QString,QStringList)' unison [ ]\"


mais une autre question,
dcop klauncher klauncher 'kdeinit_exec(QString,QStringList)' unison [ ]
est ce une sous commande ? ou un paramètre de run_on_xserver?

Car si j'ai bien compris ça semble être une sous commande et le résultat devant être exécuté par run_on_xserver?
Car si c'est une sous commande, ce n'est pas " qu'il faut mettre mais `

exemple sh `find NV*` --uninstall exécute la commande sh sur le résultat de find NV, c'est pas ce que tu veux faire?

Donc pour moi ça serait plus:

run_on_xserver `dcop klauncher klauncher 'kdeinit_exec(QString,QStringList)' unison [ ]`

ChrisdR
30/06/2007, 20h16
Merci, mais ni l'une ni l'autre des deux commandes que tu me proposes ne marche.
En fait c'est à l'intérieur des guillemets " (double quote) qu'il faut un altérateur du style \ pour les caractères spéciaux comme ( ou ' ou , ou " . Mais j'ai mis un \ devant chacun de ces caractères spéciaux mais ça ne marche pas.
En fait la fonction run_on_xserver se fait envoyé une commande bash à exécuter par le propriétaire de la session graphique en cours. Cette fonction s'appelle en mettant la commande entre guillemet " . Le fait de mettre les guillemets implique de mettre des \ devant les caractères spéciaux de la commande envoyée, mais lesquels ???

Burn2
30/06/2007, 20h30
Arf assez difficile comme problème.

Normalement y a pas forcément besoin de mettre des \ devant un caractère particulier sauf si tu ne veux pas que ça ferme un quote exemple:


test "ceci est un "exemple" "

ou exemple est sencé être intégré dedans là il est clair qu'il faut que les " " soit abstrait de la commande d'ou:

test "ceci est un \"exemple\" "

mais dans ta commande tu n'ouvres pas d'autres choses que des quote,
donc la seule solution possible que je voie c'est:


run_on_xserver "dcop klauncher klauncher \'kdeinit_exec(QString,QStringList)\' unison [ ]"

Bien que normalement il ne devrait pas y a voir de différence entre cette même commande exécutée dans le xterm et mis dans un script bash normalement. Donc je trouve ça bizard. Et je pense que tu as déjà du tester cette possibilitée?

ChrisdR
30/06/2007, 20h35
Merci, mais j'avais aussi déjà essayé cette solution mais sans succés.

Burn2
30/06/2007, 21h10
Arf dans ce cas je vois vraiment pas quoi faire d'autre. :/ Espérons que phoenix ou Angel puisse plus t'aider. Je vais encore réfléchir mais je ne vois vraiment pas ce qui cloche. Tu es sur que c'est un pb de " " ?

ChrisdR
30/06/2007, 21h58
Nan, je ne suis pas sûr, je me suis remis dessus depuis deux heures et apparemment, c'est plutôt l'appel dcop qui foire mais je ne comprends pas pourquoi...




EDIT :

En fait, si je tape :
dcop --user christophe klauncher klauncher 'kdeinit_exec(QString,QStringList)' /usr/bin/unison [ ] depuis un terminal en root ouvert dans la session graphique, ça marche.
Mais si je tape la même commande dans le bash tty1 (ctrl+alt+f1), il me sort :
call failed

Je capte pas.



EDIT 21h57 :

Bon, j'ai trouvé.
Le problème ne vient pas des " .
Je me suis fait une nouvelle fonction:

run_dcop_command_on_xserver() {
get_x_user
DEBUG "User $X_USER display $DISP dcop $1 " INFO
#echo $1 >> tmp/asus_acpi
su $X_USER -c "DISPLAY=$DISP /opt/kde3/bin/dcop --user $X_USER --session $session $1"
}

Burn2
01/07/2007, 01h28
Et là ça marche???

ChrisdR
01/07/2007, 08h40
Ouai, le seul problème est que je dois passer le nom de session en paramètre codé en dur.
En fait c'est l'appel à dcop pour klauncher depuis le processus powersave qui posait problème. C'est étonnant parce que les autres appels à dcop dans le même script ne posaenit pas problème...

Burn2
01/07/2007, 10h34
Oki http://www.alionet.org/style_emoticons/<#EMO_DIR#>/wink.gif