我在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中测试时,它们是以完全相同的方式输入的。有什么想法吗?
EDIT:失败时,shell_exec返回NULL,不执行命令。
发布于 2015-12-15 09:53:36
经过进一步测试,$tableName变量似乎包含了额外的空格。程序的另一部分是从MDB文件中提取表名,并在后面留下一个空格。
当回显$tableName变量时,一切看起来都很好,因为空格是不可见的。在运行没有用引号括起表名的shell_exec时,会执行命令,因为如果参数之间有额外的空格,则不会发生错误。但是,当用引号将变量括起来时,mdb-export程序开始查找:
"tableName "
而不是
"tableName"
导致一个无声的,但彻底的失败。
https://stackoverflow.com/questions/34279320
复制相似问题