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