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

S.I*_*.I. 6 php bash scripts

我正在尝试一些简单但无法弄清楚的事情。试图运行一个从站点目录调用 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
Run Code Online (Sandbox Code Playgroud)

我的test.php没有错误,当我直接在浏览器中运行它时,它正在工作。它又是一个简单的脚本,如

<?php
  // source code
?>
Run Code Online (Sandbox Code Playgroud)

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

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

8号线是 . "${CONFIG}${i}/test.php"

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

#!/usr/bin/php
Run Code Online (Sandbox Code Playgroud)

更新:php的路径

$ which -a php
/usr/bin/php
Run Code Online (Sandbox Code Playgroud)

我也做了 chmod +x test.php

Ben*_*nny 5

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

. "${CONFIG}${i}/test.php"  
Run Code Online (Sandbox Code Playgroud)

去除那个 .


这是另一个例子:

$ 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
Run Code Online (Sandbox Code Playgroud)

索引.php

<?php
    shell_exec('echo Hello > /tmp/hello.txt');
?>
Run Code Online (Sandbox Code Playgroud)

测试文件

#!/bin/bash
/usr/bin/php index.php
Run Code Online (Sandbox Code Playgroud)


ter*_*don 4

这里的问题是您正在引用您尝试作为单个变量运行的整个命令。因此,您没有将phpwithfoo.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  
Run Code Online (Sandbox Code Playgroud)

因此,正确的方法是删除空格并分别引用每个变量:

$ var1="echo"
$ var2="foo"
$ "$var1" "$var2"
Run Code Online (Sandbox Code Playgroud)

如果您这样做,您将遇到下一个错误。这.source命令。它尝试读取shell脚本并在当前会话中执行它。你给它一个 php 脚本。那是行不通的,你需要执行它,而不是获取它。

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

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

#!/bin/sh

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

for i in "$list"
do
    "$config" "$i"/test.php
done
Run Code Online (Sandbox Code Playgroud)