Как я могу пройти & quot; ^ | & quot; в качестве аргумента для исполняемого файла?

В среде 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);
?>

Любой совет, пожалуйста?

2

Решение

Символ канала интерпретируется оболочкой, которая выполняет вашу команду. Вам нужно либо экранировать символ канала, либо заключить аргумент в шаблон.

Вот два решения, которые работают:

$cmd='sift.exe -l --blocksize=5000000 -Q string1^\|string2 dir';

$cmd="sift.exe -l --blocksize=5000000 -Q 'string1^|string2' dir";
1

Другие решения

Как заметил Билл Карвин, вы должны избегать некоторых персонажей в вашей команде.

PHP имеет EscapeShellCmd Функция позаботится об этом, поэтому ваш код должен выглядеть так:

$cmd = 'sift.exe -l --blocksize=5000000 -Q string1^|string2 dir';
$escapedCommand = escapeshellcmd($cmd);
exec ($escapedCommand);

При желании вы можете использовать escapeshellarg функция.

Посмотри на это вопрос чтобы увидеть, каких персонажей нужно убежать.

1

По вопросам рекламы [email protected]