GNU shell 在一个嵌套的 diff 中一次做多件事

GNU shell doing multiple things in a nested diff all at once

我试图在一行中做一些事情,这是我的尝试:

coolc -P p good.cool | xargs -I {} sh -c "diff <(sed 's/@[0-9]+/@/g' {}) <(sed 's/@[0-9]+/@/g' good.out)"
  1. 我有一个名为 good.out 的文件,我想在其上 运行 sedsed 's/@[0-9]+/@/g' good.out
  2. 我想 运行 coolc -P p good.cool 将结果打印到标准输出
  3. 我想在 sed 's/@[0-9]+/@/g' {}
  4. 中使用 (2) 的输出
  5. 我想 diff (1) 和 (3)

是否可以在不创建新文件的情况下在一行中完成所有这些操作?

当然可以对此进行优化(运行宁sed一遍又一遍地在同一个good.out文件上不是很有效),但是尽可能短的翻译将您的代码转换为有效的东西(编写时假设 实际上有一个很好的理由使用 xargs):

#!/usr/bin/env bash
while IFS= read -r filename; do
  diff <(sed 's/@[0-9]+/@/g' "$filename") \
       <(sed 's/@[0-9]+/@/g' good.out)
done < <(coolc -P p good.cool)
  • bash,而不是 sh,需要使用 process substitution 语法才可用。
  • 只要 coolc -P p good.cool | xargs ... 的目的是 运行 ... 每个项目写入 coolc -P p good.cool 的标准输出一次,最好用 BashFAQ #1 while read循环.
  • BashFAQ #24: 我在管道中的循环中设置了变量。为什么它们在循环终止后就消失了?或者,为什么我不能通过管道读取数据?——这解释了为什么使用 <( ) 来提供 while read 循环而不是管道。

假设原代码使用xargs是错误的,而你真的只想运行 diff一次:

diff <(coolc -P p good.cool | sed 's/@[0-9]+/@/g') \
     <(sed 's/@[0-9]+/@/g' good.out)