如果我有两个通过 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/