如果我做:
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
它们是文件。