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 中执行此操作的最优雅(单行,清晰易懂)的方法是什么?
您看到原始命令的输出的原因是因为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)
如果您将其放入脚本中,还可以考虑使用此处创建临时命名管道的建议。
| 归档时间: |
|
| 查看次数: |
3906 次 |
| 最近记录: |