В среде PHP я пытаюсь выполнить sift (grep-подобная программа), чтобы вернуть имена файлов, если любая из двух строк совпадает.
// To return filenames having either string1 OR string2.
<?php
$cmd='sift.exe -l --blocksize=5000000 -Q string1^|string2 dir';
exec ($cmd);
?>
Я думаю, я не могу передать оператор ИЛИ (^|
) правильно.
Для сопоставления одной строки все работает нормально:
// To return filenames having string1
<?php
$cmd='sift.exe -l --blocksize=5000000 -Q string1 dir';
exec ($cmd);
?>
Любой совет, пожалуйста?
Символ канала интерпретируется оболочкой, которая выполняет вашу команду. Вам нужно либо экранировать символ канала, либо заключить аргумент в шаблон.
Вот два решения, которые работают:
$cmd='sift.exe -l --blocksize=5000000 -Q string1^\|string2 dir';
$cmd="sift.exe -l --blocksize=5000000 -Q 'string1^|string2' dir";
Как заметил Билл Карвин, вы должны избегать некоторых персонажей в вашей команде.
PHP имеет EscapeShellCmd Функция позаботится об этом, поэтому ваш код должен выглядеть так:
$cmd = 'sift.exe -l --blocksize=5000000 -Q string1^|string2 dir';
$escapedCommand = escapeshellcmd($cmd);
exec ($escapedCommand);
При желании вы можете использовать escapeshellarg функция.
Посмотри на это вопрос чтобы увидеть, каких персонажей нужно убежать.