我怎么能用bash做到这一点:
$ diff -u <(echo -e "line1\nline2") <(echo -e "line1\nline3")
--- /dev/fd/63 2009-03-30 09:49:07.527272646 +0100
+++ /dev/fd/62 2009-03-30 09:49:07.527272646 +0100
@@ -1,2 +1,2 @@
line1
-line2
+line3
即我可以使用命名管道/进程替换来获取一小段文本的差异。但是,当我尝试使用wdiff来完成此操作时,单词的diff,而不仅仅是行,我没有得到有用的输出
wdiff <(echo -e "line1\nline2") <(echo -e "line1\nline3")
[--]{++}
更新:看起来已经有一个有关此问题的Ubuntu错误报告:https://bugs.launchpad.net/ubuntu/+source/wdiff/+bug/160912
最佳答案
strace
揭示wdiff
stat
是文件(可能是找出文件的大小)。由于命名管道报告的大小为0,因此它可能假定两个文件都是空的,因此等于:
$ strace -efile wdiff -1 execve(“/usr/bin/wdiff”,[“wdiff”,“-1”,“/dev/fd/63”,“/dev/fd/62”],[/* 44个变量*/])= 0
[剪掉有趣的东西]
stat64(“/dev/fd/63”,{st_mode = S_IFIFO | 0600,st_size = 0,...})= 0
打开(“/dev/fd/63”,O_RDONLY)= 3
打开(“/tmp/wdiff.MzPXmH”,O_RDWR | O_CREAT | O_EXCL,0600)= 4
stat64(“/dev/fd/62”,{st_mode = S_IFIFO | 0600,st_size = 0,...})= 0
打开(“/dev/fd/62”,O_RDONLY)= 4
打开(“/tmp/wdiff.5nma9j”,O_RDWR | O_CREAT | O_EXCL,0600)= 5
--- SIGCHLD( child 退出)@ 0(0)-
unlink(“/tmp/wdiff.MzPXmH”)= 0
unlink(“/tmp/wdiff.5nma9j”)= 0
{++}流程27699已分离
编辑:还请注意,如果内核支持bash
,则可以使用/dev/fd
样式的文件名而不是命名管道(最新的文件名是这样,上面的示例显示了这一点),但是效果几乎相同。