PHP 用两个字符串调用 diff
PHP calling diff with two strings
我可以通过 exec()
调用 diff
就可以了,就像这样:
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
发现了差异,但即使在 $newstring === $oldstring
.
的情况下我仍然得到 1
所以我不太确定发生了什么。我只能假设,出于某种原因,exec
不喜欢进程替换?有什么想法吗?
正在使用什么shell?确保 diff 在 $PATH 中,否则命令将失败。
PHP 的 exec
运行 带有 /bin/sh
的命令不支持进程替换(即使 sh
由 bash
).
您可以 运行 您的命令明确地使用 bash -c
。
可悲的是,PHP 没有方便的功能来安全和稳健地执行 execv
风格,所以最简单的方法是构建你的 diff
命令然后转义整个事情:
exec('bash -c ' . escapeshellarg('diff -N -u <(echo '.escapeshellarg($oldstring).') <(echo '.escapeshellarg($newstring).')'), $lines);
我可以通过 exec()
调用 diff
就可以了,就像这样:
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
发现了差异,但即使在 $newstring === $oldstring
.
1
所以我不太确定发生了什么。我只能假设,出于某种原因,exec
不喜欢进程替换?有什么想法吗?
正在使用什么shell?确保 diff 在 $PATH 中,否则命令将失败。
PHP 的 exec
运行 带有 /bin/sh
的命令不支持进程替换(即使 sh
由 bash
).
您可以 运行 您的命令明确地使用 bash -c
。
可悲的是,PHP 没有方便的功能来安全和稳健地执行 execv
风格,所以最简单的方法是构建你的 diff
命令然后转义整个事情:
exec('bash -c ' . escapeshellarg('diff -N -u <(echo '.escapeshellarg($oldstring).') <(echo '.escapeshellarg($newstring).')'), $lines);