我可以通过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 :(得分:1)
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);
答案 1 :(得分:0)
正在使用什么外壳?确保diff在$ PATH中,否则命令将失败。