Nie jestem do końca pewien, o co pytasz. Wspominasz „port” kilka razy, ale w swoim przykładzie mówisz, że odpowiedź brzmi: /dev/ttyUSB0
ścieżka urządzenia, a nie port. Więc ta odpowiedź dotyczy znalezienia ścieżki dla każdego urządzenia.
Poniżej znajduje się szybki i brudny skrypt, który przegląda urządzenia w /sys
poszukiwaniu urządzeń USB z ID_SERIAL
atrybutem. Zwykle tylko prawdziwe urządzenia USB będą miały ten atrybut, więc możemy go filtrować. Jeśli nie, zobaczysz na liście wiele rzeczy, które nie są urządzeniami fizycznymi.
#!/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
W moim systemie powoduje to:
/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
Wyjaśnienie:
find /sys/bus/usb/devices/usb*/ -name dev
Urządzenia, które się pojawią, /dev
mają dev
plik w swoim /sys
katalogu. Szukamy więc katalogów spełniających te kryteria.
syspath="${sysdevpath%/dev}"
Chcemy ścieżki katalogu, więc usuwamy się /dev
.
devname="$(udevadm info -q name -p $syspath)"
To daje nam ścieżkę, /dev
która odpowiada temu /sys
urządzeniu.
[[ "$devname" == "bus/"* ]] && continue
To odfiltrowuje rzeczy, które nie są rzeczywistymi urządzeniami. W przeciwnym razie dostaniesz takie rzeczy jak kontrolery i huby USB.
eval "$(udevadm info -q property --export -p $syspath)"
W udevadm info -q property --export
listuje wszystkie właściwości urządzenia w formacie, który może być analizowany przez powłokę do zmiennych. Po prostu wzywamy eval
to. Jest to również powód, dla którego zawijamy kod w nawiasie, abyśmy używali podpowłoki, a zmienne są usuwane w każdej pętli.
[[ -z "$ID_SERIAL" ]] && continue
Więcej filtrowania rzeczy, które nie są rzeczywistymi urządzeniami.
echo "/dev/$devname - $ID_SERIAL"
Mam nadzieję, że wiesz, co robi ta linia :-)
/dev
z wpisemlsusb
? A może chcesz wymienić wszystkie urządzenia/dev
, które pochodzą z fizycznego urządzenia USB? A może po prostu chceszls /dev/ttyUSB*
?