问个 `tee` 以及 `/dev/console` 的问题

2016-06-24 23:09:19 +08:00
 SoloCompany

不想遛狗或者 SO 了,当一回伸手党吧

原来是希望能让一个输出两次, tee 比较适合做这个 比如

echo 1 | tee /dev/stdout
1
1

然后希望能够 pipe 下去,初看很美好

echo 1 | tee /dev/stdout | cat
1
1

但后来发现,实际被 pipeline 的不是一个输出,而是两个输出同时被 pipline ,比如

echo 1 | tee /dev/stdout | tr 1 2
2
2

我希望能输出 1 和 2

然后我试了下用 /dev/console,结果失败了

echo 1 > /dev/console
Σ<(っ =°Д °)っ 啥也没输出

看来是没戏了

谁能告诉我 /dev/console 或者 tee 的正确使用姿势? 或者这类需求有什么其它更好的简单解决方案

2588 次点击
所在节点   Bash
11 条回复
fcicq
2016-06-24 23:13:27 +08:00
第一问 sed 'p' 或者 sed -n 'p;p'
后面 tr 肯定也能用 sed 实现.
SoloCompany
2016-06-24 23:15:32 +08:00
@fcicq 我知道 sed 可以实现啊,但我只是举个栗子,我真是的需求是希望 pipeline 中途可以旁路输出内容(但不是写到文件里面,我知道 tee 可以干这个),然后同时继续后面的 pipeline
jybox
2016-06-24 23:16:15 +08:00
/dev/stdout 是对于「当前程序」而言的(而不是当前 Shell ),在你的第三段代码里,是 tee 在往 stdout 写数据,所以数据是被写到 tee 的标准输出的,所以会被 pipe 到 tr.
fcicq
2016-06-24 23:16:27 +08:00
@SoloCompany 那可能只能 mkfifo 然后组装了.
SoloCompany
2016-06-24 23:18:55 +08:00
@fcicq 就是觉得很复杂想看看有没有简单解决方案,因为 tee 写到临时文件也是可以解决的,而且应该比 mkfifo 要简单一些
SoloCompany
2016-06-24 23:21:59 +08:00
可能我这个本身就是不合理需求吧
pipeline 旁路应该是不能使用同一个管道的
即使可以的话,多个管道进程输出可能也会导致输出的内容发生交叉
也许只能有临时文件一种途径了
billlee
2016-06-24 23:36:07 +08:00
Process Substitution:
echo 1 | tee >(tr 1 2)
SoloCompany
2016-06-24 23:39:04 +08:00
@billlee 蟹蟹!!
rrfeng
2016-06-25 01:50:12 +08:00
💀
$ echo 1 | tee /dev/stderr | tr 1 2
1
2
rrfeng
2016-06-25 01:51:57 +08:00
$ echo 1 | tee /dev/stderr | tr 1 2 2>&1
SoloCompany
2016-06-25 10:41:07 +08:00
@rrfeng 你这是取巧,而且 pipeline 不能继续往下传递了,前面的答案才是正解,不过还是蟹蟹

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/288160

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX