【问题标题】:Usage of quotes in PHP shell_exec() commandPHP shell_exec() 命令中引号的使用
【发布时间】:2015-12-15 00:59:22
【问题描述】:

我在 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 并且命令不被执行。

【问题讨论】:

  • 不要只是说它不起作用,而是提供错误消息或进一步了解实际问题。
  • 嗨,德文郡,没有错误消息。 shell_exec() 返回 NULL 并且命令不被执行。我将编辑我的帖子以反映这一点。
  • 尝试在没有重定向的情况下回显它。 shell_exec("echo mdb-export...");看看实际执行了什么。
  • 刚从实际脚本中试了一下,得到了一个空的回声。但是,您让我想到了 return var,我尝试将其放入另一个仅包含 shell_exec 的文件中,并且 shell_exec 执行了该命令。我现在认为除了 shell_exec() 之外,我的脚本一定有问题......一旦我弄清楚发生了什么,如果它们与传递给 shell_exec() 的引号的使用有关,我将发布我的发现。

标签: php shell-exec


【解决方案1】:

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

当回显 $tableName 变量时,一切看起来都很好,因为空间是不可见的。运行 shell_exec 时不带引号将表名括起来,因为如果参数之间有多余的空格,则不会发生错误,因此会执行该命令。但是,当用引号将变量括起来时,mdb-export 程序开始查找:

"tableName " 

而不是

"tableName" 

导致无声但完全失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多