[bash] Fonction qui affiche ou execute les commandes

Fonction qui affiche ou execute les commandes [bash] - Shell/Batch - Programmation

Marsh Posté le 21-01-2006 à 14:15:00    

Salut tout le monde,
 
voila je me fais un script en bash qui extrait la bande son de mes dvds musicaux, pour me faciliter le développement, j'ai ajouté un mode de "simulation", en gros, selon qu'on appelle le script dans ce mode ou pas, soit il exécute les commandes, soit il les affiche simplement sur la sortie standard.
 
Le problème c'est que la fonction que j'utilise pour ca n'est pas au point.
 
Dans le script, je remplace toutes les commandes par _exec ma_commande arg1 .... argn où exec est ma fonction.
 
Voilà le code de la fonction, si vous pouviez m'aider à la corriger :)
 

Code :
  1. # permet d'executer une commande ou simplement d'afficher la commande si
  2. # on est en mode simulation
  3. _exec()
  4. {
  5.     if [ $SIMMODE == 1 ]; then
  6. local OUT=""
  7. local ERR=""
  8. echo -e "$@"
  9.     else
  10. $@ # on ne se moque pas !
  11. if [ $? == 1 ]; then
  12.     STATUS=1
  13. fi
  14.     fi
  15. }


 
Merci :jap:

Reply

Marsh Posté le 21-01-2006 à 14:15:00   

Reply

Marsh Posté le 21-01-2006 à 15:24:06    

L'idée est ingénieuse... et à vue de nez je vois pas ce qui cloche. Malheureusement je peux pas tester parce que je suis pas au bureau et j'ai pas Linux chez-moi. Je présume que ça plante là où t'as mis "$@ # on ne se moque pas" et que ça n'exécute pas tes arguments. Si tu pouvais me dire ce que ça fait ce serait un plus. Sinon voici les pistes que je peux te proposer

  • remplacer "$@" par "$*"
  • remplacer "$@" par "eval $@"


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 21-01-2006 à 16:03:03    

En fait ce qui se passe c'est que tous les carractères de d'échappement sont utilisés par l'appel de fonction.
 
exemple :  
_exec cp "/tmp/un fichier" "/tmp/un autre fichier"
appelle la commande
cp /tmp/un fichier /tmp/un autre fichier
 
et forcément ca marche beaucoup moins bien !
 
:jap:

Reply

Marsh Posté le 21-01-2006 à 21:40:50    

hmm,je suis pas sur de tout comprendre....
 
En gros, si tu dit que lorsque tu execute ta fonction,elle execute la commande au lieu de l'ecrire a l'ecran,c'est qu'il y a un probleme avec ta variable $SIMMODE (elle est pas initialise a 1....)
car apres ton else tu ecris $@ (ce qui est execute par le shell),donc si tu met des commande, le shell les execute.
 
Execute ton script avec "set -x" a la seconde ligne pour voir le details de l'initialisation des variables et du deroulement des test...
 


---------------
War is Peace,Freedom is Slavery,Ignorance is Strength.
Reply

Marsh Posté le 22-01-2006 à 00:25:00    

"$@" # on ne se moque pas !


  Special Parameters
[...]
       @      Expands  to  the positional parameters, starting from one.  When
              the  expansion  occurs  within  double  quotes,  each  parameter
              expands to a separate word.  That is, "$@" is equivalent to "$1"
              "$2" ...  When there are no positional parameters, "$@"  and  $@
              expand to nothing (i.e., they are removed).

Reply

Marsh Posté le 22-01-2006 à 00:58:11    

Merci de vos réponses.
 
Alors en fait je vais essayer de m'expliquer clairement, quand je ne suis pas en mode simulation, donc dans le cas du else, les commandes que je veux exécuter ne s'exécutent pas comme je le voudrais.
 
Donc pour reprendre mon exemple de tout à l'heure, si dans mon script je mets la ligne _exec cp "/tmp/un fichier" "/tmp/un autre fichier",
à l'exécution c'est la commande cp /tmp/un fichier /tmp/un autre fichier qui est exécutée, je perds donc la protection des espaces et caractères spéciaux.
 
Je cherche un moyen de régler ca.
J'ai essayé aussi d'appeler ma fonction comme ca :
_exec cp \"/tmp/un fichier\" \"/tmp/un autre fichier\" mais ca deviens galère par exemple si les chaines à protéger contiennent des apostrophes ou autre caractère spécial.
 
Enfin en solution provisoire j'ai viré le mode simulation qui finalement ne me facilite pas la tache.

Reply

Marsh Posté le 22-01-2006 à 01:05:29    

Essaie d'utiliser sed pour échapper les caractères qui posent problème alors.
Quelque chose comme :
`echo $@ | sed 's%\%\\%g;s% %\ %g'`
 
Je n'ai pas non plus de shell sous la main donc ce n'est pas testé, désolé.
 
(Edit : typo)


Message édité par Zavie le 22-01-2006 à 01:05:56

---------------
Viendez vous battre à Prologin \o/
Reply

Marsh Posté le 22-01-2006 à 02:59:55    

madkat : tu as lu mon post ? Il faut mettre le $@ entre guillemets : "$@"

Reply

Marsh Posté le 22-01-2006 à 13:35:15    

matafan a écrit :

madkat : tu as lu mon post ? Il faut mettre le $@ entre guillemets : "$@"


 
Oui j'avais essayé, mais ca fait que ta commande est considérée comme un seul argument
=> cp /tmp/un fichier /tmp/un autre fichier : command not found :D

Reply

Marsh Posté le 22-01-2006 à 13:47:44    

Si ca vous intéresse, je mets le script là, il a besoin d'un nettoyage mais ca commence à marcher correctement.
 
Ca marche avec mplayer, kdialog, normalize-audio et lame.


Message édité par madkat le 22-01-2006 à 13:48:19
Reply

Marsh Posté le 22-01-2006 à 13:47:44   

Reply

Marsh Posté le 22-01-2006 à 21:54:01    

madkat a écrit :

Oui j'avais essayé, mais ca fait que ta commande est considérée comme un seul argument
=> cp /tmp/un fichier /tmp/un autre fichier : command not found :D


Tu dois avoir un problème ailleurs, car le script suivant fonctionne parfaitement :

#!/bin/sh
 
_exec()
{
        echo -e "$@"
        "$@" # on ne se moque pas !
}
 
_exec cp "toto" "nouveau toto"

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed