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
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
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
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!