如果我有两个通过 USB 连接的设备(在 linux 中)并且想同时读取它们。本质上,它们永远不会终止,但我想在它们读取一行时读取它们(每行以 \r\n 结尾)。

下面是它在 Python 中的样子:

from threading import Thread

usb0 = open("/dev/ttyUSB0", "r")
usb1 = open("/dev/ttyUSB1", "r")

def read0():
    while True: print usb0.readline().strip()

def read1():
    while True: print usb1.readline().strip()

if __name__ == '__main__':
    Thread(target = read0).start()
    Thread(target = read1).start()

有没有办法在 bash 中做到这一点。我知道你可以这样做:
while read -r -u 4 line1 && read -r -u 5 line2; do
  echo $line1
  echo $line2
done 4</dev/ttyUSB0 5</dev/ttyUSB1

然而,这实际上每隔几秒就会切断我的部分线路。我真的很好奇这是否可能并且并不真正需要它,因为在 Java 或 Python 等现代编程语言中使用线程非常容易。

最佳答案

无法在 bash 中启动线程,但您可以 fork 两个后台作业进行读取。您需要将读取操作分散到两个单独的 while 结构中,并使用与号运算符 & 将它们置于后台:

#!/bin/bash

# Make sure that the background jobs will
# get stopped if Ctrl+C is pressed
trap "kill %1 %2; exit 1" SIGINT SIGTERM

# Start a read loop for both inputs in background
while IFS= read -r line1 ; do
  echo "$line1"
  # do something with that line ...
done </dev/ttyUSB0 &

while IFS= read -r line2 ; do
  echo "$line2"
  # do something with that line ...
done </dev/ttyUSB1 &

# Wait for background processes to finish
wait %1 %2
echo "jobs finished"

关于bash - 实时读取两个文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26595977/

10-16 13:48