我正在尝试一些简单但无法弄清楚的事情。试图运行一个从站点目录调用 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
您的代码中的问题是这一行:
. "${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)
这里的问题是您正在引用您尝试作为单个变量运行的整个命令。因此,您没有将php
withfoo.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)
归档时间: |
|
查看次数: |
33304 次 |
最近记录: |