web-dev-qa-db-fra.com

Appeler et exécuter un script php à partir d'un script shell

J'essaie quelque chose de simple mais je ne peux pas le comprendre. Essayer d'exécuter un script Shell qui appelle un script php à partir du répertoire du site. Mon script Shell est simple test.sh:

#!/bin/sh

LIST="/path/to/my/site/dir"
CONFIG="/usr/bin/php "

for i in $LIST
do
    . "${CONFIG}${i}/test.php"        
done

Mon test.php ne contient pas d'erreur et lorsque je l'exécute directement dans le navigateur, cela fonctionne. C'est encore un script simple comme

<?php
  // source code
?>

Lorsque je lance ./test.sh le résultat est

./test.sh: 8:.: Impossible d'ouvrir/usr/bin/php /path/to/my/site/dir/test.php

La ligne 8 est . "${CONFIG}${i}/test.php"

J'ai aussi essayé d'ajouter au début du fichier PHP cette ligne, mais le résultat est identique.

#!/usr/bin/php

UPDATE: chemin d'accès à php

$ which -a php
/usr/bin/php

J'ai aussi fait chmod +x test.php

6
S.I.

Le problème ici est que vous citez la commande entiore que vous essayez d’exécuter en tant que variable unique. Par conséquent, vous n'exécutez pas php avec foo.php en tant qu'argument, mais essayez d'exécuter un fichier appelé php foo.php. Voici un exemple plus simple pour vous montrer ce que je veux dire:

$ var1="echo "
$ var2="foo"
$ set -x ## debugging info
$ "$var1$var2"
+ 'echo foo'      ### The Shell tries to execute both vars as a single command
bash: echo foo: command not found

$ "$var1" "$var2"
+ 'echo ' foo     ### The Shell tries to execute 'echo ' (echo with a space)
bash: echo foo: command not found  

Donc, la bonne façon consiste à supprimer l'espace et à citer chaque variable séparément:

$ var1="echo"
$ var2="foo"
$ "$var1" "$var2"

Si vous faites cela cependant, vous frapperez l'erreur suivante. Le . est la commande source . Cela tente de lire un script Shell et de l'exécuter dans la session en cours. Vous lui donnez un script php à la place. Cela ne fonctionnera pas, vous devez l'exécuter , pas source il.

Enfin, évitez toujours d’utiliser des noms de variables CAPITAL. Les variables réservées du shell sont mises en majuscule. Il est donc judicieux de toujours utiliser des noms de variables en minuscule pour vos scripts.

En mettant tout cela ensemble (avec quelques autres améliorations mineures), vous voulez quelque chose comme:

#!/bin/sh

list="/path/to/my/site/dir"
config="/usr/bin/php"

for i in "$list"
do
    "$config" "$i"/test.php
done
3
terdon

Le problème dans votre code est la ligne:

. "${CONFIG}${i}/test.php"  

Supprimer le .


Voici un autre exemple:

$ ls -l

-rwxrwxr-x 1 bg bg 67 Oct 20 09:42 index.php
-rwxrwxr-x 1 bg bg 68 Oct 20 09:43 test.sh

index.php

<?php
    Shell_exec('echo Hello > /tmp/hello.txt');
?>

test.sh

#!/bin/bash
/usr/bin/php index.php
4
Benny

Habituellement, la commande php est utilisée pour l'interprétation de PHP scripts dans le shell.

$ php /path/script-name.php

J'ai fait simple test.sh et ça marche:

$ cat ./text.sh
#!/bin/bash
Sudo php /var/www/wiki/maintenance/update.php

$ chmod +x ./test.sh
$ ./test.sh

Ça marche.

Après cela, j'ai créé un script compliqué comme exemple:

$ cat ./text.sh

#!/bin/sh

LIST=/var/www/wiki/maintenance
CONFIG=/usr/bin/php

for i in $LIST
do
    ${CONFIG} ${i}/update.php
done

$ Sudo ./test.sh

Ça marche!

$ cat ./text.sh

#!/bin/sh

LIST="/var/www/wiki/maintenance"
CONFIG="/usr/bin/php "

for i in $LIST
do
    ${CONFIG}${i}/update.php
done

$ Sudo ./test.sh

Ça marche aussi!

3
pa4080