Я не зовсім впевнений, про що ви питаєте. Ви кілька разів згадуєте про «порт», але потім у своєму прикладі ви кажете, що відповідь - /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*
?