从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
也工作!