从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没有错误,当我直接在浏览器中运行它时,它正在工作。 它再简单的脚本就好

  

当我运行./test.sh结果是

./test.sh:8 :.:无法打开/ usr / bin / php /path/to/my/site/dir/test.php

第8行是. "${CONFIG}${i}/test.php" . "${CONFIG}${i}/test.php"

我也试过在PHP文件的开头添加这行,但结果是一样的

 #!/usr/bin/php 

更新:php的路径

 $ which -a php /usr/bin/php 

我也做了chmod +x test.php

这里的问题是你引用了你试图作为单个变量运行的entiore命令。 因此,您没有使用foo.php作为参数运行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命令 。 这会尝试读取shell脚本并在当前会话中执行它。 你给它一个PHP脚本而不是。 这不起作用,你需要执行它,而不是它。

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

把所有这些放在一起(还有一些其他的小改进),你想要的是:

 #!/bin/sh list="/path/to/my/site/dir" config="/usr/bin/php" for i in "$list" do "$config" "$i"/test.php done 

对我来说效果很好,例如:

$ 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

  /tmp/hello.txt'); ?> 

test.sh

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

我认为代码中的问题是:

 . "${CONFIG}${i}/test.php" 

删除.

通常命令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 

也工作!