有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否可以通过stdin数据流的第一个字节触发bash命令来运行?

我有以下管道bash命令:

command_1 | command_2 | command_3

其中command_1正在等待生成数据流,该数据流触发command_2开始处理它,然后将处理数据流发送到command_3

问题是我不知道command_1何时启动,并且command_2不能在数据流到达之前启动(否则command_2将失败,因为没有数据要处理)command_3在这种情况下并不特殊

我想知道command_2可以在一个bash/python/java脚本中执行,该脚本等待从command_1读取标准数据流的第一个字节,然后该第一个字节将触发command_2的开始执行,该脚本需要处理第一个字节和标准数据流的剩余连续字节(command_2不应跳过{}中的任何字节,否则结果将无效)

这个command_2逻辑可以在脚本中实现吗。有什么想法吗


共 (3) 个答案

  1. # 1 楼答案

    我猜这是一个bash管道。如果是这样,我认为你误解了这些管道的执行方式

    1. 每个管道|都被创建为一个输入输出缓冲区
    2. 每个命令都是在标准输入/输出被替换为相关缓冲端(如果需要)时创建的
      2.1. std in>;命令1>;缓冲区1
      2.2. 缓冲区1>;命令2>;缓冲区2 2.3缓冲器2>;命令3>;性病发作

    command_2“读取”数据时,它将在buffer_1上阻塞,直到数据在那里可用。它将在收到EOF信号时结束其进程。{}还没有写入数据这一事实不是问题

  2. # 2 楼答案

    是的,这是可能的,例如,在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()
    

    'received {line}'将被传递给命令_3

  3. # 3 楼答案

    一些读者显然没有满足您的要求,即在管道数据可用之前不启动command_2,因为否则会超时。使用这个脚本非常简单,我将其称为^{

    #!/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