从命令行和php运行脚本的不同结果

从命令行和php运行脚本的不同结果,php,bash,shell,Php,Bash,Shell,我正在尝试从PHP运行bash脚本。当我在命令提示符下运行它时——一切正常,当我将相同的命令传递给exec()时——意外的事情发生了 该脚本平均从第三个参数传递的图像文件。第一个参数是目录,第二个是结果文件 bash脚本: #!/bin/bash DIR=$1 avg_file=$2 i=0 for file in "$@"; do if [ $i -eq 0 ]; then : elif [ $i -eq 1 ]; then : eli

我正在尝试从PHP运行bash脚本。当我在命令提示符下运行它时——一切正常,当我将相同的命令传递给exec()时——意外的事情发生了

该脚本平均从第三个参数传递的图像文件。第一个参数是目录,第二个是结果文件

bash脚本:

#!/bin/bash

DIR=$1
avg_file=$2
i=0
for file in "$@"; do
    if [ $i -eq 0 ]; then
        :
    elif [ $i -eq 1 ]; then
        :
    elif [ $i -eq 2 ]; then
    # If first file - just copy to result
        cp ${DIR}${file} ${DIR}${avg_file}
    else
    # Merge current file with result
        convert ${DIR}${file} ${DIR}${avg_file} -fx "(u+($i-2)*v)/$[$i-1]" ${DIR}${avg_file}
    fi
    i=$[$i+1]
done
使用以下命令行调用脚本时:

/path/to/script.sh/path/to/images average.png image/1.png image/2.png“

它工作正常,将图像平均到average.png,但使用PHP调用时:

exec(“/path/to/script.sh/path/to/images average.png image/1.png image/2.png”)

它似乎用第一个传递的图像替换了average.png,就是这样。我试着调试它,它似乎通过了所有的参数

问题的原因可能是什么


*编辑:更新了将f-ion转换为实际外观的方法

检查您的PHP脚本位置,如我所见

average.png image/1.png image/2.png


您使用的是相对路径,但您可能希望使用完整路径,因此我在convert调用的末尾添加了
2>&11>/dev/null
,并使用php shell_exec再次运行它。它输出的结果是找不到
convert
函数,因此我添加了
putenv(“path=/usr/local/bin:/usr/bin:/bin”)
在shell_exec调用之前,现在它可以工作了!这里的想法:

您可以用php而不是bashPrint来完成所有传递的参数:echo$@@Dagon我可能不得不这样做,因为我真的认为我在这里调试该脚本的选项已经用完了。在php中执行该操作“繁琐”,而且用一种语言编写代码比用几种语言编写代码更容易once@crafter它会在传递参数时打印所有参数。我想可能是因为convert函数由于任何原因无法工作,因为结果会被替换为第一个文件,意思是“cp”“行。我检查了路径,一切正常。将脚本更改为使用相对路径,其工作原理相同。不过,上面的脚本使用从第一个参数构建的绝对路径。