Fonction qui affiche ou execute les commandes [bash] - Shell/Batch - Programmation
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
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 !
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...
Marsh Posté le 22-01-2006 à 00:25:00
"$@" # on ne se moque pas ! |
Special Parameters |
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.
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)
Marsh Posté le 22-01-2006 à 02:59:55
ReplyMarsh 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
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 |
Tu dois avoir un problème ailleurs, car le script suivant fonctionne parfaitement :
#!/bin/sh |
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
Merci