Petit parser PHP en shell

Résolu/Fermé
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 - 11 oct. 2008 à 00:22
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 - 21 sept. 2009 à 14:15
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 ! ;)
A voir également:

10 réponses

Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
13 oct. 2008 à 13:44
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
21 sept. 2009 à 09:47
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
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
21 sept. 2009 à 09:16
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
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
21 sept. 2009 à 10:10
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
21 sept. 2009 à 10:35
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
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
21 sept. 2009 à 13:51
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
21 sept. 2009 à 14:06
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
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
21 sept. 2009 à 14:15
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
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
13 oct. 2008 à 14:58
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
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
13 oct. 2008 à 16:25
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
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
13 oct. 2008 à 18:41
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