由PHP exec()运行的Bash脚本没有正确地进行重定向

时间:2013-06-21 12:08:10

标签: php bash exec io-redirection

我有一个脚本,它接受一些参数并将heredoc的输出重定向到另一个文件,以便为Web服务器创建一个虚拟主机文件。 当我在命令行中运行脚本时,它执行正常并且创建了文件,但是当我使用PHP的exec或shell_exec运行它时,它不会创建文件。其他所有(回显或试图简单地返回输出而不是重定向)运行正常 - 只是创建文件没有发生,我没有收到任何迹象表明存在问题。

这是我的代码: create_vhost.sh:

#!/bin/bash
#Use the template to create the vhost file
echo "Creating vhost file in sites-available"
sudo /absolute/path/to/vhost_template.sh $1 $2 > /etc/nginx/sites-available/$2
service nginx restart

我像这样运行上面的脚本:/absolute/path/to/create_vhost.sh site_id domain.com并且使用ssh与终端完美配合。

作为参考,vhost_template文件是这样的:

#!/bin/sh

SITE_ID=$1
DOMAIN=$2

#define the template.
cat  << EOF
[template code here with $SITE_ID and $DOMAIN parameters somewhere]
EOF

但是,如果我在PHP中运行它是这样的:

return shell_exec("/absolute/path/to/create_vhost.sh site_id domain.com");

我输出得很好,但没有创建文件!就像我说的,如果我放弃重定向,那么即使在PHP中我也看到模板文件的输出没有问题。

我一直在看这几个小时,但我只是难过。有什么建议吗?

编辑:只是想我提到我认为这可能是权限问题,但我尝试在shell_exec()中使用sudo,并使用visudo为www-data用户提供sudo权限。还是同样的问题......

1 个答案:

答案 0 :(得分:3)

您可能错过了发送到stderr的重要信息,因此您可以尝试将stderr输出重定向到stdout。将帮助您调试问题。

return shell_exec("/absolute/path/to/create_vhost.sh site_id domain.com 2>&1");