将括号扩展与流程替换结合起来

时间:2018-07-25 19:35:17

标签: linux bash shell zsh

说我有2个文件(foobar),我想比较它们。通过文件大括号扩展,我可以执行以下任一操作,并获得相同的结果:

diff foo bar
diff {foo,bar}

现在让我们说我想在对它们进行比较之前对它们进行快速排序。使用进程替换,我可以执行以下命令:

diff <(sort foo) <(sort bar)

我想做的就是以某种方式缩短此时间。我在想像这样的东西:

diff <(sort {foo,bar})

但是不幸的是,这不起作用。有任何想法吗?我很乐意完全犯错误。

2 个答案:

答案 0 :(得分:2)

Diff需要2个文件名才能工作。 <()返回该进程的标准输出的文件描述符;基本上,您的stdout临时是一个文件,并且diff读取这2个文件并进行比较。 <()只能返回1个文件描述符,无论您在其中推送了多少命令。他们所有的标准输出都放在同一个地方,无法区分两者。这是设计使然。

如果您真的认为diff <(sort foo) <(sort bar)太多了,可以写

h() {
    diff <(sort $1) <(sort $2)
}

然后执行h {foo,bar}

答案 1 :(得分:1)

{foo,bar}的扩展仅计算为一系列连续的标记。您正在寻找的是对一系列输入重复相同的过程(sort)。

提供的处理变得更加复杂和重复,您可以将其隐藏在函数中:

def process() {
  echo ... $1 ...
}
diff <(process foo) <(process bar)

随着diff参数数量的增加,您可以循环处理它们,将输出存储在临时文件中,然后将文件名数组扩展为diff参数。

总而言之,我看不到一种简化代码的方法(免除缩短变量或处理函数名称的要求)。