Я могу позвонить 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
не нравится процесс замены? Есть идеи?
РНР exec
запускает команду с /bin/sh
, который не поддерживает подстановку процесса (даже когда sh
обеспечивается bash
).
Вместо этого вы можете явно запустить команду bash -c
,
К сожалению, PHP не имеет удобных функций для безопасного и надежного execv
выполнение стиля, поэтому самый простой способ сделать это, чтобы построить diff
команда, а затем избежать всего этого:
exec('bash -c ' . escapeshellarg('diff -N -u <(echo '.escapeshellarg($oldstring).') <(echo '.escapeshellarg($newstring).')'), $lines);
Какая оболочка используется? Убедитесь, что diff находится в $ PATH, иначе команда не будет выполнена.