【发布时间】: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