Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
1089 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [bash] Fonction qui affiche ou execute les commandes

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[bash] Fonction qui affiche ou execute les commandes

n°1288914
madkat
Posté le 21-01-2006 à 14:15:00  profilanswer
 

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:

mood
Publicité
Posté le 21-01-2006 à 14:15:00  profilanswer
 

n°1288948
Sve@r
Posté le 21-01-2006 à 15:24:06  profilanswer
 

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.
n°1288966
madkat
Posté le 21-01-2006 à 16:03:03  profilanswer
 

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:

n°1289158
shaman200
Posté le 21-01-2006 à 21:40:50  profilanswer
 

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.
n°1289225
matafan
Posté le 22-01-2006 à 00:25:00  profilanswer
 

"$@" # 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).

n°1289238
madkat
Posté le 22-01-2006 à 00:58:11  profilanswer
 

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.

n°1289243
Zavie
Test, du travail de pro !
Posté le 22-01-2006 à 01:05:29  profilanswer
 

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/
n°1289310
matafan
Posté le 22-01-2006 à 02:59:55  profilanswer
 

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

n°1289405
madkat
Posté le 22-01-2006 à 13:35:15  profilanswer
 

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

n°1289414
madkat
Posté le 22-01-2006 à 13:47:44  profilanswer
 

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
mood
Publicité
Posté le 22-01-2006 à 13:47:44  profilanswer
 

n°1289729
matafan
Posté le 22-01-2006 à 21:54:01  profilanswer
 

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"


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [bash] Fonction qui affiche ou execute les commandes

 

Sujets relatifs
Scanneur de balise html, reitération d'une fonctionMon site ne s'affiche pas chez tout le monde :(
Fonction fcntlFonction SQLRequest non définie!
[Résolu]Fonction Pos : mon code ne marche pasUtilser une fonction d'une DLL d'un driver XP dans une autre DLL ?
excel : fonction pour effacer le contenu d'une celluleFacteur de deplacement avec fonction scale
Soucis avec fonctionpointeur de fonction
Plus de sujets relatifs à : [bash] Fonction qui affiche ou execute les commandes


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR