在PHP环境中,我试图执行sift(a grep-like program)以在两个字符串中的任何一个匹配时返回文件名。
// To return filenames having either string1 OR string2.
<?php
$cmd='sift.exe -l --blocksize=5000000 -Q string1^|string2 dir';
exec ($cmd);
?>
我猜我无法正确传递OR运算符(^|
)。
为了匹配单个字符串,它可以正常工作:
// To return filenames having string1
<?php
$cmd='sift.exe -l --blocksize=5000000 -Q string1 dir';
exec ($cmd);
?>
请问任何建议?
答案 0 :(得分:1)
管道符号由执行命令的shell解释。您需要转义管道符号,或引用模式参数。
以下是两种有效的解决方案:
$cmd='sift.exe -l --blocksize=5000000 -Q string1^\|string2 dir';
$cmd="sift.exe -l --blocksize=5000000 -Q 'string1^|string2' dir";
答案 1 :(得分:1)
正如Bill Karwin指出的那样,你必须逃脱命令中的一些角色。
PHP具有http://spark.apache.org/docs/latest/cluster-overview.html#components功能来处理这个问题,因此您的代码应如下所示:
i
您可以选择使用escapeshellcmd功能。
请查看此escapeshellarg,了解哪些字符需要转义。