首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在shell脚本中获取逗号stdout的fd文件名的可移植方式

在shell脚本中获取逗号stdout的fd文件名的可移植方式
EN

Stack Overflow用户
提问于 2014-08-02 11:17:53
回答 1查看 34关注 0票数 0

我很确定我缺少这方面的术语,这可能是谷歌让我失望的原因。是否有一种可移植和简单的方法将标准输出重定向到多个命令。

换句话说,我如何解决这个可移植性问题:

代码语言:javascript
复制
$ /bin/bash -c '(echo to your mom) | tee >(read b; echo "agent 1 reports $b") >(read b; echo "agent 2 reports $b")  >(read b; echo "agent 3 reports $b")'
to your mom
agent 1 reports to your mom
agent 2 reports to your mom
agent 3 reports to your mom
$ /bin/zsh -c '(echo to your mom) | tee >(read b; echo "agent 1 reports $b") >(read b; echo "agent 2 reports $b")  >(read b; echo "agent 3 reports $b")'
to your mom
agent 1 reports to your mom
agent 3 reports to your mom
agent 2 reports to your mom
$ /bin/sh -c '(echo to your mom) | tee >(read b; echo "agent 1 reports $b") >(read b; echo "agent 2 reports $b")  >(read b; echo "agent 3 reports $b")'
/bin/sh: 1: Syntax error: "(" unexpected

注意输出顺序不是问题,/bin/sh会产生错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-02 11:49:59

使用命名管道:

代码语言:javascript
复制
#!/bin/sh

fifo1=$(exec mktemp --dry-run)
mkfifo "$fifo1"
( read b; echo "agent 1 reports $b" ) < "$fifo1" &

fifo2=$(exec mktemp --dry-run)
mkfifo "$fifo2"
( read b; echo "agent 2 reports $b" ) < "$fifo2" &

fifo3=$(exec mktemp --dry-run)
mkfifo "$fifo3"
( read b; echo "agent 3 reports $b" ) < "$fifo3" &

echo to your mom | tee "$fifo1" "$fifo2" "$fifo3"

rm -f "$fifo1" "$fifo2" "$fifo3"

用法:

代码语言:javascript
复制
sh script.sh

输出:

代码语言:javascript
复制
to your mom
agent 2 reports to your mom
agent 1 reports to your mom
agent 3 reports to your mom

这就是科学。有了功能,你可以使技术,使管道容易为您根据您的喜好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25094449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档