首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >stdin数据流的第一个字节会触发bash命令运行吗?

stdin数据流的第一个字节会触发bash命令运行吗?
EN

Stack Overflow用户
提问于 2016-12-06 21:08:42
回答 3查看 96关注 0票数 2

我有以下管道bash命令:

代码语言:javascript
复制
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逻辑可以在脚本中实现吗?有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2016-12-06 21:14:42

是的,这是可能的,例如,在python中,你只需阅读stdin:

代码语言:javascript
复制
  import sys

  for line in sys.stdin:
      if line == b'something':
          print('received', line)

根据您的用例,您可能需要刷新输出,因此您可以执行以下操作,而不是打印:

代码语言:javascript
复制
import sys

sys.stdout.write(b'received {line}')
sys.stdout.flush()

将向command_3传递'received {line}'

票数 0
EN

Stack Overflow用户

发布于 2018-04-30 21:24:16

一些读者显然错过了在管道数据可用之前启动command_2的要求,因为否则就会超时。使用这个脚本非常简单,我将其命名为postpone.py

代码语言:javascript
复制
#!/usr/bin/env python
import select
select.select([0], [], [])
import os
import sys
os.execvp(sys.argv[1], sys.argv[1:])

它只是等待输入准备就绪,然后执行给定的命令。用法例如:

代码语言:javascript
复制
command_1 | postpone.py command_2 | command_3
票数 0
EN

Stack Overflow用户

发布于 2018-04-30 21:35:59

我猜这是一个bash管道command_1 | command_2 | command_3。如果是这样的话,我认为您误解了这些管道的执行方式。

  1. 每个管道|被创建为输入输出缓冲区。
  2. 创建每个命令时,如果需要,它的标准输入/输出将被相关的缓冲区端替换。

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还没有写入数据这一事实并不是问题。

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

https://stackoverflow.com/questions/40996191

复制
相关文章

相似问题

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