从 shell 脚本调用并运行 php 脚本

从 shell 脚本调用并运行 php 脚本

我正在尝试一些简单的事情,但还是搞不清楚。尝试运行一个从站点目录调用 php 脚本的 shell 脚本。我的 shell 脚本很简单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

答案1

您的代码中的问题是这一行:

. "${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

索引.php

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

测试文件

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

答案2

这里的问题是,你引用了试图作为单个变量运行的 entiore 命令。因此,你没有将其作为参数运行phpfoo.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 脚本。这行不通,你需要执行它不是来源它。

最后,始终避免使用大写变量名。shell 的保留变量是大写的,因此最好始终为脚本使用小写变量名。

将所有这些放在一起(加上一些其他的小改进),您想要的是:

#!/bin/sh

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

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

答案3

通常命令 php 用于在 shell 中解释 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

也有效!

相关内容