Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中,如何将一个进程的输出定向到stdout并通过管道传递到另一个进程?_Bash - Fatal编程技术网

在bash中,如何将一个进程的输出定向到stdout并通过管道传递到另一个进程?

在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

在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 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

为什么有黑客行为?我更新了我的回复来说明为什么有黑客行为