我有以下管道bash命令:
command_1 | command_2 | command_3其中command_1正在等待生成一个数据流,该数据流触发command_2开始处理它,然后将处理后的数据流发送到command_3。
问题是我不知道command_1什么时候启动,command_2不能在数据流到达之前启动(否则command_2会失败,因为没有数据要处理)。在这种情况下,command_3并不特殊。
我想知道command_2是否可以在等待从command_1读取标准输出数据流的第一个字节的bash/python/java脚本中执行,然后这个第一个字节将触发command_2的执行,它需要处理这个第一个字节和标准输入数据流的其余连续字节(command_2不应该跳过command_1中的任何字节,否则结果将是无效的)。
这个command_2逻辑可以在脚本中实现吗?有什么想法吗?
发布于 2016-12-06 21:14:42
是的,这是可能的,例如,在python中,你只需阅读stdin:
import sys
for line in sys.stdin:
if line == b'something':
print('received', line)根据您的用例,您可能需要刷新输出,因此您可以执行以下操作,而不是打印:
import sys
sys.stdout.write(b'received {line}')
sys.stdout.flush()将向command_3传递'received {line}'
发布于 2018-04-30 21:24:16
一些读者显然错过了在管道数据可用之前启动command_2的要求,因为否则就会超时。使用这个脚本非常简单,我将其命名为postpone.py
#!/usr/bin/env python
import select
select.select([0], [], [])
import os
import sys
os.execvp(sys.argv[1], sys.argv[1:])它只是等待输入准备就绪,然后执行给定的命令。用法例如:
command_1 | postpone.py command_2 | command_3发布于 2018-04-30 21:35:59
我猜这是一个bash管道command_1 | command_2 | command_3。如果是这样的话,我认为您误解了这些管道的执行方式。
|被创建为输入输出缓冲区。2.1。标准输入--> command_1 --> buffer_1
2.2。buffer_1 --> command_2 --> buffer_2 2.3 buffer_2 --> command_3 --> std-out
当command_2“读取”数据时,它将在buffer_1上阻塞,直到数据可用为止。当它得到EOF信号时,它将结束其处理。command_1还没有写入数据这一事实并不是问题。
https://stackoverflow.com/questions/40996191
复制相似问题