Я не совсем уверен, что вы спрашиваете. Вы упоминаете «порт» несколько раз, но затем в своем примере вы говорите, что ответом является /dev/ttyUSB0
путь устройства, а не порт. Таким образом, этот ответ о поиске пути разработки для каждого устройства.
Ниже приведен быстрый и грязный скрипт, который просматривает устройства в /sys
поиске USB-устройств с ID_SERIAL
атрибутом. Обычно только настоящие 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
выводит список всех свойств устройства в формате, который может быть проанализирован оболочкой в переменные. Поэтому мы просто призываем eval
к этому. Это также причина, по которой мы заключаем код в круглые скобки, чтобы мы использовали подоболочку, а переменные стирались в каждом цикле.
[[ -z "$ID_SERIAL" ]] && continue
Больше фильтрации вещей, которые не являются реальными устройствами.
echo "/dev/$devname - $ID_SERIAL"
Я надеюсь, что вы знаете, что делает эта строка :-)
/dev
с записью вlsusb
? Или вы хотите перечислить все устройства,/dev
которые являются производными от физического USB-устройства? Или ты просто хочешьls /dev/ttyUSB*
?