如果我们想要diff两条命令的输出,一种容易想到的做法是将两条命令的输出分别重定向到两个文件中,然后diff两个文件的内容:
$ readelf -WS ./a.out > a.txt
$ readelf -WS ./a.out.full > b.txt
$ diff a.txt b.txt
而bash的Process Substitution机制可以帮助我们简化类似上面这类工作,把三条命令合并成一条:
$ diff <(readelf -WS ./a.out) <(readelf -WS ./a.out.full)
process substitution有两种形式:
<(command)
>(command)
其中第一种比较常用,它会创建一个文件(实际上是一个命名管道),command的标准输出会被重定向到这个文件中,然后<(command)整体会被替换为这个文件路径,我们可以从下面的命令以及输出中观察上述过程:
$ echo <(ls)
/dev/fd/63$ file <(ls)
/dev/fd/63: symbolic link to pipe:[9008834]$ ls -lh <(ls)
lr-x------ 1 root root 64 May 12 14:32 /dev/fd/63 -> ‘pipe:[9008840]’$ cat <(ls)
a.out
a.o

本文介绍了如何使用bash的ProcessSubstitution技巧,通过一条命令替代了先写入文件再diff的传统方法,演示了如何将`readelf`的输出直接对比,提高了shell脚本的简洁性和效率。
最低0.47元/天 解锁文章
866

被折叠的 条评论
为什么被折叠?



