PHP使用两个字符串

时间:2018-01-21 18:32:39

标签: php bash 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不喜欢流程替换?有什么想法吗?

2 个答案:

答案 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中,否则命令将失败。