bash — PHP вызывает diff с двумя строками

Я могу позвонить diff с помощью exec() просто отлично с файлами, вот так:

exec('diff -N -u '.escapeshellarg($oldfile).' '.escapeshellarg($newfile), $lines);

Однако попытка сделать это с произвольными строками не удалась:

exec('diff -N -u <(echo '.escapeshellarg($oldstring).') <(echo '.escapeshellarg($newstring).')', $lines);

Если я скопирую команду, запускаемую в bash, она работает просто отлично. Но при запуске в PHP я не получаю вывод. Четное 2>&1 ничего не дает. Захват кода состояния дает 1, который должен указывать, что diff нашел отличия, но все равно получаю 1 даже в том случае, когда $newstring === $oldstring,

Так что я не совсем уверен, что происходит. Я могу только предположить, что по какой-то причине exec не нравится процесс замены? Есть идеи?

0

Решение

РНР exec запускает команду с /bin/sh, который не поддерживает подстановку процесса (даже когда sh обеспечивается bash).

Вместо этого вы можете явно запустить команду bash -c,

К сожалению, PHP не имеет удобных функций для безопасного и надежного execv выполнение стиля, поэтому самый простой способ сделать это, чтобы построить diff команда, а затем избежать всего этого:

exec('bash -c ' . escapeshellarg('diff -N -u <(echo '.escapeshellarg($oldstring).') <(echo '.escapeshellarg($newstring).')'), $lines);
1

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

Какая оболочка используется? Убедитесь, что diff находится в $ PATH, иначе команда не будет выполнена.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector