2015-12-15 256 views
0

我在PHP中遇到了shell_exec()函数的一个有趣的情况。此命令的工作:PHP shell_exec()命令中引号的用法

$res = shell_exec("mdb-export -D \"%d/%m/%y\" ".$this->mdbFileName." ".$tableName." &> " . $outputFile); 

但是,此命令不起作用:

$res = shell_exec("mdb-export -D \"%d/%m/%y\" ".$this->mdbFileName." \"".$tableName."\" &> " . $outputFile); 

当一个shell输入命令(无论哪种方式 - 带或不带周围的表名引号),它工作正常。我真的想知道为什么第一套逃脱的报价并不影响了shell_exec():

\"%d/%m/%y\" 

但第二组:

\"".$tableName."\" 

不允许了shell_exec执行。仅供参考:脚本中的所有文件名变量均为完整文件路径。在壳体中进行测试时,它们以完全相同的方式输入。有什么想法吗?

编辑:失败后,shell_exec返回NULL并且不执行命令。

+0

不仅仅是说它不起作用,而是提供错误信息或进一步了解实际问题。 – Devon

+0

嗨德文,没有错误信息。 shell_exec()返回NULL并且不执行该命令。我将编辑我的帖子以反映这一点。 – user2395126

+1

尝试在没有重定向的情况下回显它。 shell_exec(“echo mdb-export ...”);看看实际执行的是什么。 – Devon

回答

0

经过一些更多的测试后,看起来$ tableName变量包含一个额外的空间。该程序的另一部分是从MDB文件中提取表名并留下尾部空格。

当回显$ tableName变量时,一切都显得很好,因为空间是不可见的。当运行shell_exec时没有围绕表名称的引号时,执行该命令是因为如果参数之间有额外的空格则不会发生错误。然而,与周围的报价变量时,该MDB-出口计划开始寻找:中

"tableName " 

代替

"tableName" 

造成了沉默,但完全失败。