在C程序中使用diff shell命令和system()查找两个文件的差异

0yg35tkg  于 2023-02-05  发布在  Shell
关注(0)|答案(1)|浏览(183)

我发现使用diff inside system()很难重定向两个文件中的差异,尝试了所有的排列和组合,但失败了。

status = system("/bin/sh -c /usr/bin/diff old_ap.json ap_afterTtime.json |tr -d '<> ---,'> diffoutput");

错误:
/usr/bin/差异:"/usr/bin/diff "后缺少操作数
/usr/bin/差异:有关详细信息,请尝试使用'/usr/bin/diff--help '。
尝试使用两个输入文件的绝对路径,但输出文件仍然为空。虽然每次写入输出文件时都为空。我尝试读取两个Json文件,发现写入和存储在一个文件中的数据存在差异。

6gpjuf90

6gpjuf901#

我试过这个程序,重现问题:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    system("/bin/sh -c /usr/bin/diff old_ap.json ap_afterTtime.json |tr -d '<> ---,'> diffoutput");
}

我得到了错误missing operand after '/usr/bin/diff',就像报告的那样。
问题是,当您使用sh -c时,-c后面的命令必须是单个参数。
我认为这里不需要-c,因此我将system调用更改为

system("/usr/bin/diff old_ap.json ap_afterTtime.json |tr -d '<> ---,'> diffoutput");

错误消失了,创建了一个文件diffoutput
为了完整起见,我还尝试了

system("/bin/sh -c \"/usr/bin/diff old_ap.json ap_afterTtime.json |tr -d '<> ---,'> diffoutput\"");

这保留了-c,但是使用了额外的引号,这样-c就可以将整个命令看作一个参数。
您说删除sh -c没有帮助,所以您的环境一定有什么不同。您运行的是什么操作系统?

相关问题