用三通和粘贴工艺替代

Ari*_*ima 6 bash process-substitution tee

我正在尝试通过其他两个命令的输出来传递一个命令,然后合并两个进程替换的结果。一个让我接近的例子是:

command | tee >(sed -rn 's/.*foo (bar).*/1/p') >(awk '{print $3}')
Run Code Online (Sandbox Code Playgroud)

但是,我想实现以下目标:

  • 我不需要看到原始命令的输入流
  • 我想使用“粘贴”来合并结果

我想一种选择是运行两个单独的命令并将它们放入文件中,但这并不像我想要的那么优雅。在 bash 中执行此操作的最优雅(单行,清晰易懂)的方法是什么?

Gra*_*eme 9

您看到原始命令的输出的原因是因为tee输出到stdout以及指定的文件。要丢弃它,您可以将其放在>/dev/null命令的末尾或通过添加额外的 将此输出重定向到您的进程替换之一>,例如:

command | tee >(sed -rn 's/.*foo (bar).*/1/p') > >(awk '{print $3}')
Run Code Online (Sandbox Code Playgroud)

或者更简单,只需使用另一个管道:

command | tee >(sed -rn 's/.*foo (bar).*/1/p') | awk '{print $3}'
Run Code Online (Sandbox Code Playgroud)

至于使用 组合两个进程替换的结果paste,除非有一些我不知道的晦涩的 shell 技巧,否则不使用命名管道就无法做到这一点。最终这是两行(为了清楚起见,格式化为更多):

mkfifo /tmp/myfifo
command |
  tee >(sed -rn 's/.*foo (bar).*/1/p' >/tmp/myfifo) |
  awk '{print $3}' |
  paste /tmp/myfifo -
Run Code Online (Sandbox Code Playgroud)

如果您将其放入脚本中,还可以考虑使用此处创建临时命名管道的建议。