执行 diff

执行 diff

如果我做:

diff <(cat old) <(cat new)

这对 diff 程序内部有效吗?我如何使用 bash 脚本实现同样的技巧?

答案1

你可以自己尝试一下:

echo <(echo) <(echo)

Diff 只是从两个文件中读取。

如果您想用作<(...)bash 脚本的参数,请记住您无法“倒回”文件(或重新打开)。所以一旦你读了它,它就消失了。您可以使用read逐行处理它,您可以grep它或其他什么。如果您需要多次处理它,请将其内容保存到变量中

input=$(cat "$1"; printf x) # The "x" keeps the trailing empty lines.
input=${input%x}

或者将其复制到临时文件并一遍又一遍地读取:

tmp=$(mktemp)
cat "$1" > "$tmp"

答案2

对于diff程序来说,与键入 没有区别diff old new。该<(cmd)运算符将 的 stdout 重定向cmd1到 fifo,然后将 fifo 作为参数传递给diff

看一个例子:

user@host:~$ echo <(ls)
/dev/fd/63

/dev/fd/63是包含 输出的 fifo ls,seecat <(ls)打印 fifo 的输出,因此输出ls

因此,diff程序的执行方式如下:

diff /dev/fd/63 /dev/fd/64

两个 fifo 都包含 cmd 的输出。因为diff它们是文件。

相关内容