我不确定您要问什么。您多次提到“端口”,但是在您的示例中,答案是/dev/ttyUSB0
,这是设备开发路径,而不是端口。因此,此答案是关于找到每个设备的开发路径。
下面是一个快速且肮脏的脚本,该脚本在/sys
查找具有ID_SERIAL
属性的USB设备的过程中遍历了设备。通常,只有真正的USB设备才会具有此属性,因此我们可以对其进行过滤。如果我们不这样做,您会在列表中看到很多不是物理设备的东西。
#!/bin/bash
for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
(
syspath="${sysdevpath%/dev}"
devname="$(udevadm info -q name -p $syspath)"
[[ "$devname" == "bus/"* ]] && continue
eval "$(udevadm info -q property --export -p $syspath)"
[[ -z "$ID_SERIAL" ]] && continue
echo "/dev/$devname - $ID_SERIAL"
)
done
在我的系统上,这导致以下结果:
/dev/ttyACM0 - LG_Electronics_Inc._LGE_Android_Phone_VS930_4G-991c470
/dev/sdb - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/sdb1 - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/input/event5 - Logitech_USB_Receiver
/dev/input/mouse1 - Logitech_USB_Receiver
/dev/input/event2 - Razer_Razer_Diamondback_3G
/dev/input/mouse0 - Razer_Razer_Diamondback_3G
/dev/input/event3 - Logitech_HID_compliant_keyboard
/dev/input/event4 - Logitech_HID_compliant_keyboard
说明:
find /sys/bus/usb/devices/usb*/ -name dev
显示在其中的设备在其目录中/dev
有一个dev
文件/sys
。因此,我们搜索符合此条件的目录。
syspath="${sysdevpath%/dev}"
我们需要目录路径,因此我们将其剥离/dev
。
devname="$(udevadm info -q name -p $syspath)"
这为我们提供了/dev
与此/sys
设备相对应的路径。
[[ "$devname" == "bus/"* ]] && continue
这可以过滤掉不是实际设备的东西。否则,您将获得USB控制器和集线器之类的东西。
eval "$(udevadm info -q property --export -p $syspath)"
该udevadm info -q property --export
命令以Shell可以解析为变量的格式列出所有设备属性。所以我们简单地呼吁eval
这一点。这也是我们将代码包装在括号中的原因,以便我们使用子外壳,并在每个循环中擦除变量。
[[ -z "$ID_SERIAL" ]] && continue
对不是实际设备的事物进行更多过滤。
echo "/dev/$devname - $ID_SERIAL"
我希望你知道这行的作用:-)
/dev
与中的条目相关联lsusb
?还是要列出所有/dev
从物理USB设备派生的设备?还是您只是想要ls /dev/ttyUSB*
?