Forum Programmation.shell Execution d'une commande avec redirection...

Posté par  .
Étiquettes : aucune
0
26
juil.
2004
Bonjour :) ,

J'écris un petit script pour des gens qui veulent compiler un noyau sans trop se pencher sur le pb (je sais mais tant pis pour eux)

pour lancer les differents "make", je passe par une fonction qui contient (sans backquotes) :


make $1 $AFFICHE


si je remplace les variables par du dur pour donner une idée, un echo sur cette ligne donne, par exemple :


make dep >/dev/null 2>compil_du_lun_26_jui_16_08


Cette commande execute le make dep correctement en m'affichant tout à l'écran :(
et finit par :


make: *** Pas de règle pour fabriquer la cible `>/dev/null'. Arrêt.


Quelqu'un peut-il m'expliquer SVP ?

Précision : je teste la même commande à la ligne de commande et tout va bien :
Un écran propre pendant l'exectution du "make dep" et les warnings dans le fichier compil_du_lun_26_jui_16_08...

Plus marrant (hum... ) :
les lignes (avec backquotes) :


echo "Début de make $1 $AFFICHE"
`make $1 $AFFICHE`


donnent :


Début de make dep >/dev/null 2>compil_du_lun_26_jui_16_21
md5sum: AVERTISSEMENT: 1 des 13 sommes de contrôle checksums ne concordent pas.
make: *** Pas de règle pour fabriquer la cible `>/dev/null'. Arrêt.
./compilation: line 62: make[1]:: command not found


Pas d'affichage en dehors des warnings (donc interpretation du ">/dev/null" je suppose ), et pourtant, toujours tentative de faire un "make >/dev/null" et plantage...

Je comprends plus...
Oscourt...
  • # shell

    Posté par  (site web personnel) . Évalué à 3.

    c'est le shell qui "détecte" et interprête certains caractères spéciaux comme >, < ou encore |, puis qui construit l'appel des programmes que tu lances.

    en clair, le shell va construire la commande make avec le contenu de tes variables, mais ne cherchera pas à interpréter leur contenu comme pouvant contenir des caractères spéciaux. c'est comme si on passait de :

    [gc@meuh /tmp] echo citron > /dev/null

    à :

    [gc@meuh /tmp] echo citron '>' '/dev/null'
    citron > /dev/null

    pour faire ce que tu souhaites, tu es obligé de faire une commande sans redirection et une commande avec redirection dans ton script, que tu brancheras selon le contenu d'une autre variable par exemple.
    • [^] # Re: shell

      Posté par  . Évalué à 1.

      Merci, j'y suis arrivé avec tes infos...

      C'est pas facile la vie... ;)
    • [^] # Re: shell

      Posté par  . Évalué à 5.

      Ou encore tu peux utiliser 'eval' pour forcer l'expension de tes variables avant l'interprétation de la ligne de commande :
      % foo="foo"
      % bar=">/dev/null"
      % echo $foo $bar
      foo >/dev/null
      % eval echo $foo $bar
      %
      
      Lors du premier echo, comme l'a dit gc, deux arguments ont été passés et affichés. Pour le deuxième par contre, grâce au eval, bash a d'abord changé "echo $foo $bar" en "echo foo >/dev/null", puis a interprété cette ligne complète comme il le fait d'habitude, avec donc un seul argument et une redirection sur /dev/null.
      • [^] # Re: shell

        Posté par  . Évalué à 1.

        Bon sang, mais c'est bien sûr !!!

        Merci, je m'en servirais la prochaine fois...
        Je vais pas effacer les 15 if...elif que je viens de taper... ;)
  • # Moi aussi j'ai un script sur ma machine

    Posté par  (site web personnel) . Évalué à 1.

    Il s'appelle make-kpkg et bon dieu qu'il fonctionne bien ;-)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.