Назовите и выполните сценарий PHP из сценария оболочки

Я пробую что-то простое, все же не может, понял это. Попытка выполнить один сценарий оболочки, которые называют сценарий 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

6
задан 19 October 2016 в 23:13

3 ответа

Проблема здесь состоит в том, что Вы заключаете 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
3
ответ дан 23 November 2019 в 07:31

Проблемой в Вашем коде является строка:

. "${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
4
ответ дан 23 November 2019 в 07:31

Обычно команда 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

Работы также!

3
ответ дан 23 November 2019 в 07:31

Другие вопросы по тегам:

Похожие вопросы: