【问题标题】:How to close a string the way that bash does in php CLI or suppress error output?如何以 bash 在 php CLI 中的方式关闭字符串或抑制错误输出?
【发布时间】:2013-03-26 03:44:47
【问题描述】:

如果您使用此代码创建一个简单的 php 脚本:

shell_exec('"');

然后运行它:

php myscript.php

它在我的 Mac 上的 bash 中给出以下错误:

sh: -c: line 0: unexpected EOF while looking for matching `"'
sh: -c: line 1: syntax error: unexpected end of file

我已经尝试了所有我能想到的:

ob_start();
@shell_exec('"');
ob_end_clean();

@shell_exec('" 2> /dev/null');

但无论我如何尝试,我都无法压制该消息。问题是我正在创建一个单元测试来对通用工具的 $argc、$argv 和 getopt() 命令进行压力测试,并且我需要使用包含随机字符(如“”)的各种输入来调用脚本数百次=:等等。

所以我需要能够抑制错误输出,或者检测不平衡的引号并将 ' 或 " 附加到字符串的末尾。我发现这个正则表达式可以检测单引号和双引号字符串:

PHP: Regex to ignore escaped quotes within quotes

但是对于一个混合了带引号和不带引号的参数的通用 bash 命令,我无法想象如何执行此操作。是否有内置命令可以告诉我字符串是否可以接受而不会引发错误?然后我可以尝试附加“'”或“”',我相当肯定其中一个会关闭字符串。我现在只关心防止错误消息,因为我只是在随机输入此时的脚本。

谢谢!

【问题讨论】:

  • 你试过escapeshellarg吗?
  • 不清楚您要做什么,因为“ 2> /dev/null 不是有效的 bash 命令。
  • 对两者都好:我不能使用 escapeshellarg(),因为我试图将格式错误的查询传递给 CLI 以对 getopt() 进行压力测试。另外,我将我作为双引号传递的随机命令字符串表示为双引号,我应该更具体(它是一个随后混合字符的命令)。
  • 对于仍在阅读此问题的任何人,我意识到我仍然没有正则表达式或方法来验证我传递给 shell_exec() 的字符串。这使得在后台生成进程变得困难,因为我事先不知道它们在解析参数时是否会失败,尤其是在我关闭 STDERR 时。似乎 php 无法将 STDERR 重定向到变量而不是输出,但我可能是错的。也许我给出的答案太快了,但是,它是我问题的可行解决方案。

标签: php bash command-line-interface shell-exec suppress


【解决方案1】:

子 shell 进程正在将错误消息写入 STDERR,它继承自父 PHP 进程。您可以在运行 shell_exec() 之前在 PHP 脚本中关闭父级的 STDERR 文件句柄。

<?php
fclose (STDERR);
shell_exec('"');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2013-01-07
    • 2012-06-24
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多