Petit parser PHP en shell

Résolu
Groarh Messages postés 706 Statut Membre -  
Groarh Messages postés 706 Statut Membre -
Bonjour à tous,
je travaille très souvent sur des postes de mon campus universitaire, où sont installés les distribs
openSUSE 10.3 et Gentoo (je sais plus quelle version).
Web developer las de devoir passer par le ftp pour vérifier chaque modification de script php, je me suis demandé s'il n'y avait pas moyen de faire plus simple. En fouillant un peu, je constate que sous les deux systèmes, je dispose de PHP mais pas d'Apache, et je n'ai pas de droits d'admin pour installer quoi que ce soit.

J'ai alors tenté de me faire un petit parser maison, en traitant un fichier php par un shell assez léger, pour obtenir un fichier htm correspondant. Problème : je m'y connais assez peu en shell... L'idée de base c'est :
php -f fichier.php > fichier.htm

Ce que j'aimerais, c'est :
- d'une part, générer un .htm avec le même nom que le .php ;
- d'autre part, si c'est pas trop lourd à mettre en oeuvre, pouvoir lancer le parser en balançant le script dessus par glisser/déposer (simple question de confort, mais le but c'est aussi que j'apprenne en shell ^^)

Toute idée, je suis preneur, exprimez-vous ! ;)
Configuration: Windows XP
Firefox 3.0.3

10 réponses

  1. Groarh Messages postés 706 Statut Membre 185
     
    Bonjour,
    en attendant une réponse ici, je continue mes recherches. Je posterai si j'ai des éléments de solution, afin que ça serve à d'autres. ;)
    1
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Alors on va commencer par éviter le la création d'une variable (${tmp}) et remplacer les quotes inverses (qui ne sont plus utilisées et pas très lisibles) par la syntaxe adéquate ( $(commande) ):
    if [ -f $1 ]
    then
            php -f $1 > ${1/\.*/.html}
            firefox file://$(pwd)/${1/\.*/.html}
    else
            echo "$1 introuvable"
    fi

    Ensuite, pour ton histoire d'effacer le fichier qu'une fois le programme s'est terminé, il faut utiliser la commande "wait", mais auparavant il faut lancer firefox en arrière-plan (ceci se fait grâce à esperluette "&") et faire une pause avec la commande "wait" qui attend patiemment que le dernier "job" lancé en arrière-plan se termine pour continuer l'exécution des commandes suivantes :
    if [ -f $1 ]
    then
            php -f $1 > ${1/\.*/.html}
            firefox file://$(pwd)/${1/\.*/.html} &
            wait
            rm -f /$(pwd)/${1/\.*/.html}
    else
            echo "$1 introuvable"
    fi
    ;-))

    PS. Fait un test avant pour la transformation de la variable :
    jp@MDK:~/tmpfs ssh$ echo ${1}
    essai.php
    
    jp@MDK:~/tmpfs ssh$ echo ${1/\.*/.html}
    essai.html
    
    jp@MDK:~/tmpfs ssh$ echo $(pwd)/${1}
    /home/jp/tmpfs/essai.php
    
    jp@MDK:~/tmpfs ssh$ echo $(pwd)/${1/\.*/.html}
    /home/jp/tmpfs/essai.html
    
    jp@MDK:~/tmpfs ssh$
    ;-))
    1
  3. Groarh Messages postés 706 Statut Membre 185
     
    Hello !
    Après presque un an (déjà !), je remonte ce vieux topic avec une question qui s’inscrit dans la continuité. Commençons par présenter l’aspect actuel du script, qui a bénéficié de mes progrets en bash :

    #! /bin/bash
    # miniparser
    
    if [ -f $1 ]
    then
            str=`basename $1`
            tmp=${str%%.php*}.htm
            php -f $1 > $tmp
            firefox file://`pwd`/$tmp
    else
            echo "$1 introuvable"
    fi
    

    Je dispose en outre d’un script de nettoyage assez primitif :

    #! /bin/bash
    # cleanup
    
    rm -f *.htm

    Ce qui nous amène à ma question :
    si j’appelle rm directement dans le script « miniparser », après firefox, celui-ci n’a pas le temps de lire le fichier temporaire. Je me demande donc s’il faut utiliser un délai, ou si je peux dire à l’interpréteur quelque chose du genre :
    « attends que Firefox ait fini de lire ce fichier avant d’éxécuter la commande suivante ».

    Merci aux âmes charitables qui me répondront :P
    0
  4. Groarh Messages postés 706 Statut Membre 185
     
    Salut,
    la grande classe, merci jipicy ;)
    La syntaxe $(commande) existe aussi en shell simple (/bin/sh) ? Sinon, ça explique pourquoi je suis passé à côté…
    Peux-tu m’en dire plus sur la manip ${var/regexp/} ?

    Et encore une question, ne vaut-il pas mieux utiliser une variable temporaire plutôt que faire appel trois fois à une regexp ?
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Re-

    Oui la syntaxe existe aussi pour le "shell sh", qui sur beaucoup de distribution récente est en fait le shell "bash" (/bin/sh/ est bien souvent un lien symbolique pointant sur /bin/bash) :
    jp@MDK:~/tmpfs ssh$ ls -l /bin/sh
    lrwxrwxrwx  1 root root 4 déc 15  2005 /bin/sh -> bash*
    jp@MDK:~/tmpfs ssh$
    

    Sinon, concernant la "regex", ce n'est pas gênant dans la mesure où c'est à défaut de regex plutôt une implémentation naturelle dans le shell...

    Voir à ce sujet le man bash et plus particulièrement le la partie "Remplacement des paramètres".

    ;-))
    0
  7. Groarh Messages postés 706 Statut Membre 185
     
    Ok merci ;)

    Voici ma version, j’utilise quand même une variable temporaire pour alléger le code :

    #! /bin/bash
    
    if [ -f $1 ]
    then
            tmp=$(basename ${1/\.php*/.htm})
            php -f $1 > $tmp
            firefox file://$(pwd)/$tmp &
            wait
            rm -f $tmp
    else
            echo "$1 introuvable"
    fi
    
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Tu aurais pu tout aussi bien :
      #! /bin/bash
      
      if [ -f $1 ]
      then
              html="${1/\.*/.html}"
              php -f $1 > ${html}
              firefox file://$(pwd)/${html} &
              wait
              rm -f /$(pwd)/${html}
      else
              echo "$1 introuvable"
      fi
      0
  8. Groarh Messages postés 706 Statut Membre 185
     
    Ok, mais ça me paraît logique de poser le fichier temporaire dans le working dir. Si jamais il y a un crash avant le rm, je le retrouverai plus facilement…
    0
  9. Groarh Messages postés 706 Statut Membre 185
     
    Premiers éléments de réponse.

    Après avoir créé le fichier shell miniparser.sh, je l'ai rendu exécutable avec la commande
    chmod +x miniparser.sh
    Ensuite, je l'ai édité :
    php -f index.php > index.parsed.htm
    firefox index.parsed.htm
    exit


    Reste à régler :
    - le nom de fichier variable ;
    - le passage du fichier en argument.
    ( M'est avis que ces deux problèmes n'en sont qu'un seul en réalité... )
    - J'ai essayé d'utiliser un pipelining pour passer directement le résultat à Firefox, mais ça ne marche pas, je ne suis pas au point sur la syntaxe.
    # code qui ne marche pas #
    php -f index.php | firefox
    Si vous avez une idée...

    Je continue à chercher.
    -1
  10. Groarh Messages postés 706 Statut Membre 185
     
    Solution pour le pipelining, après des heures de lecture (Google n'a pas été très amical cette fois-ci, mais j'ai fini par trouver par hasard sur wikipédia) :
    firefox `php -f index.php`


    Et finalement, la solution du passage de paramètre avec la variable $1, trouvée sur le site d'un IUT de Paris, répond à presque toutes les autres questions :
    #!/bin/bash
    
    if test -f $1
    then
    firefox `php -f $1`
    else
    echo "$1 : fichier introuvable"
    fi
    Ça marche à merveille, sauf que... sous OpenSUSE, je me suis rendu compte que php n'était pas installé. Damn it, fuck'n administrateur réseau à la noix !!

    Je laisse tomber pour le glisser-déposer, c'est une vieille habitude prise sous Windows, mais apparemment Gnome n'est pas aussi tolérant : si tu ne poses pas sur un dossier, il ne veut rien entendre.

    Le topic est donc résolu, je remercie tous ceux qui m'ont apporté leur aidé précieuse :D
    Bonne soirée à tous.
    -1
  11. Groarh Messages postés 706 Statut Membre 185
     
    Rhaa non, c'est faux, c'est complètement faux ce que j'ai écrit !! Et plus moyen d'éditer !
    Je ne peux pas passer le contenu d'un fichier à Firefox, je dois lui passer son nom !
    #!/bin/bash
    
    if test -f $1
    then
    php -f $1 > "$1.htm"
    firefox "$1.htm"
    else
    echo "$1 : fichier introuvable"
    fi
    -1