Я пробую что-то простое, все же не может, понял это. Попытка выполнить один сценарий оболочки, которые называют сценарий PHP из каталога сайта. Мой сценарий оболочки прост test.sh
:
#!/bin/sh
LIST="/path/to/my/site/dir"
CONFIG="/usr/bin/php "
for i in $LIST
do
. "${CONFIG}${i}/test.php"
done
Мой test.php
не имеет ошибок и когда я выполняю его непосредственно в браузере, это работает. Это снова простой сценарий как
<?php
// source code
?>
Когда я работаю ./test.sh
результат
./test.sh: 8:.: не Может открыть/usr/bin/php/path/to/my/site/dir/test.php
Строка 8 . "${CONFIG}${i}/test.php"
Я попытался также добавить в начале файла PHP эту строку, но результат - то же
#!/usr/bin/php
ОБНОВЛЕНИЕ: Путь к php
$ which -a php
/usr/bin/php
Я также сделал chmod +x test.php
Проблема здесь состоит в том, что Вы заключаете entiore в кавычки, управляют, чтобы Вы попытались работать как единственная переменная. В результате Вы не работаете php
с foo.php
как аргумент, но вместо этого пытаются выполнить названный файл php foo.php
. Вот более простой пример, чтобы показать Вам, что я имею в виду:
$ 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
Так, правильный путь состоит в том, чтобы удалить пространство и заключить каждую переменную в кавычки отдельно:
$ var1="echo"
$ var2="foo"
$ "$var1" "$var2"
Если Вы делаете это, хотя, Вы поразите следующую ошибку. .
source
команда. Это пытается прочитать сценарий оболочки и выполнить его на текущей сессии. Вы даете ему сценарий PHP вместо этого. Это не будет работать, необходимо выполнить его, не получить его.
Наконец, всегда избегайте использования ПРОПИСНЫХ имен переменной. Зарезервированные переменные оболочки использованы для своей выгоды так, это - хорошая идея всегда использовать имена переменной нижнего регистра для Ваших сценариев.
Соединение всего этого (с несколькими другими незначительными улучшениями), что Вы хотите, является чем-то как:
#!/bin/sh
list="/path/to/my/site/dir"
config="/usr/bin/php"
for i in "$list"
do
"$config" "$i"/test.php
done
Проблемой в Вашем коде является строка:
. "${CONFIG}${i}/test.php"
Удаляют .
, Вот другой пример:
$ 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
Обычно команда php используется для интерпретации Сценариев PHP в оболочке.
$ php /path/script-name.php
я сделал простой test.sh, и он работает:
$ cat ./text.sh
#!/bin/bash
sudo php /var/www/wiki/maintenance/update.php
$ chmod +x ./test.sh
$ ./test.sh
Это работает.
После этого я сделал сложный сценарий как Ваш пример:
$ 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
Это работает!
$ 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
Работы также!