在PHP shell_exec()命令中使用引号

时间:2015-12-15 00:59:23

标签: 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中进行测试时,它们以完全相同的方式输入。有什么想法吗?

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

1 个答案:

答案 0 :(得分:0)

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

当回显$ tableName变量时,一切都显得很好,因为空间是不可见的。当运行shell_exec而不包含表名周围的引号时,执行该命令,因为如果参数之间有额外的空格,则不会发生错误。但是,当用引号包围变量时,mdb-export程序开始寻找:

"tableName " 

而不是

"tableName" 

导致沉默但完全失败。