两个程序的Diff输出没有临时文件

Ver*_*gen 142 bash diff file

说我有太多的程序ab,我可以跑./a./b.

是否可以在不首先写入临时文件的情况下区分其输出?

Joh*_*ica 207

使用<(command)一个命令的输出传递到另一个程序,就好像它是一个文件名.Bash将程序的输出传递给管道,并将文件名传递/dev/fd/63给外部命令.

diff <(./a) <(./b)
Run Code Online (Sandbox Code Playgroud)

类似地,>(command)如果要将某些东西输入命令,则可以使用.

这在Bash的手册页中称为"过程替换".

  • OP确实标记了bash的问题,但是对于记录,这在任何其他shell中都不起作用.它是Posix实用程序标准的bash扩展. (5认同)
  • 我用Java程序尝试了这个解决方案并得到了这个错误:`-bash:语法错误接近意外令牌('`.我再次尝试没有括号并得到`-bash:java:没有这样的文件或目录`.它不起作用如果命令有参数? (4认同)
  • 要注意的一个缺点是,如果 ./a 或 ./b 失败,调用者将不会发现。 (2认同)

bro*_*oot 25

添加两个答案,如果要查看并排比较,请使用vimdiff:

vimdiff <(./a) <(./b)
Run Code Online (Sandbox Code Playgroud)

像这样的东西:

在此输入图像描述


mar*_*ton 20

一种选择是使用命名管道(FIFO):

mkfifo a_fifo b_fifo
./a > a_fifo &
./b > b_fifo &
diff a_fifo b_fifo
Run Code Online (Sandbox Code Playgroud)

......但John Kugelman的解决方案更加清晰.

  • 这虽然更便携,甚至在我的路由器上工作:-) (7认同)

Jam*_*hon 14

对于任何好奇的人,这是使用Fish shell执行进程替换的方法:

击:

diff <(./a) <(./b)
Run Code Online (Sandbox Code Playgroud)

鱼:

diff (./a | psub) (./b | psub)
Run Code Online (Sandbox Code Playgroud)

不幸的是,鱼类的实施目前存在缺陷 ; fish将挂起或使用磁盘上的临时文件.您也不能使用psub来输出命令.

  • 谢谢!正在寻找那个. (2认同)

小智 7

为已经很好的答案添加一点(帮助我!):

该命令docker输出其帮助STD_ERR(即文件描述符2)

我想看看docker attach,并docker attach --help给了相同的输出

$ docker attach

$ docker attach --help

刚输入这两个命令后,我做了以下操作:

$ diff <(!-2 2>&1) <(!! 2>&1)

!与-1相同,这意味着在此之前运行命令1 - 最后一个命令

!-2表示在此之前运行命令2

2>&1表示将file_descriptor 2输出(STD_ERR)发送到与file_descriptor 1输出(STD_OUT)相同的位置

希望这有一些用处.