我正在尝试一些简单的事情,但还是搞不清楚。尝试运行一个从站点目录调用 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 命令。因此,你没有将其作为参数运行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 脚本。这行不通,你需要执行它不是来源它。
最后,始终避免使用大写变量名。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
也有效!