在bash中,如何将一个进程的输出定向到stdout并通过管道传递到另一个进程?
在bash中,如何将一个进程的输出定向到stdout并通过管道传递到另一个进程 我在mac中使用bashshell 我有两个python程序在bash中,如何将一个进程的输出定向到stdout并通过管道传递到另一个进程?,bash,Bash,在bash中,如何将一个进程的输出定向到stdout并通过管道传递到另一个进程 我在mac中使用bashshell 我有两个python程序generate.py和sum.py generate.py将整数打印到标准输出 当使用python3 generate.py运行时,它会生成 1 2 3 4 ... ... sum.py只消耗generate.py的输出并保留计数器,一旦generate.py完成sum.py输出最终值 但是,当我使用下面的bash命令运行时 python3 genera
generate.py
和sum.py
generate.py
将整数打印到标准输出
当使用python3 generate.py运行时,它会生成
1
2
3
4
...
...
sum.py
只消耗generate.py
的输出并保留计数器,一旦generate.py
完成sum.py
输出最终值
但是,当我使用下面的bash命令运行时
python3 generate.py>&2|python3 sum.py
我看不到python3 sum.py的输出
但是如果我这样做,python3 generate.py | python3 sum.py
我可以看到sum的结果。py
被打印到stdout,但我看不到stdout中generate.py
的输出
因此,我要查看的是,在管道传输数据时,
generate.py
和sum.py
的输出。有什么想法吗?使用tee命令在tty和程序stdin之间分割输出
echo "hello" | tee /dev/tty | pbcopy
在你的情况下是这样的
python3 generate.py | tee /dev/tty | python3 sum.py
你可以这样做
python3 generate.py | tee /dev/stderr | python3 sum.py
但是“/dev/stderr”和“/dev/tty”都是特殊的“设备文件”,我们应该避免以这种方式使用它
python3 generate.py | tee /dev/stderr | python3 sum.py | wc -l
这更容易用一个例子来说明。如果我们用管道构造一个链式命令,通常的期望是,整个链式管道的行为将类似于一个单一的一致命令(整个管道从stdin获取输入,并将所有输出写入stdout,错误将进入stderr)
如果我在末尾附加“| wc-l”(计算行数),它将期望返回“generate.py”和“sum.py”的行数
但这样做是行不通的
python3 generate.py | tee /dev/stderr | python3 sum.py | wc -l
wc输出仅为“1”,表示“sum.py”中的单行
关于“/dev/tty”,它指的是一个“控制终端”设备文件。有关更多信息,请参阅。但本质上,这不是一个“设备文件”,应该用来生成输出我更喜欢这个命令:
( command1 | tee /dev/fd/3 | command2 ) 3>&1
其优点是,完整的输出被合并到stdout,而stderr作为第二个通道仍然完好无损。因此,这可以作为函数或脚本使用,通常在外部重定向
转换为您的命令:
( python3 generate.py | tee /dev/fd/3 | python3 sum.py ) 3>&1
为什么有黑客行为?我更新了我的回复来说明为什么有黑客行为