Non sono sicuro di quello che stai chiedendo. Lei parla più volte 'porta', ma poi nel tuo esempio, si dice la risposta è /dev/ttyUSB0
, che è un percorso del dispositivo dev, non una porta. Quindi questa risposta riguarda la ricerca del percorso di sviluppo per ciascun dispositivo.
Di seguito è riportato uno script rapido e sporco che guida i dispositivi alla /sys
ricerca di dispositivi USB con un ID_SERIAL
attributo. In genere solo i dispositivi USB reali avranno questo attributo e quindi possiamo filtrare con esso. In caso contrario, vedrai un sacco di cose nell'elenco che non sono dispositivi fisici.
#!/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
Sul mio sistema, ciò si traduce in quanto segue:
/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
Spiegazione:
find /sys/bus/usb/devices/usb*/ -name dev
I dispositivi che compaiono in /dev
hanno un dev
file nella loro /sys
directory. Quindi cerchiamo directory che soddisfino questi criteri.
syspath="${sysdevpath%/dev}"
Vogliamo il percorso della directory, quindi eliminiamo /dev
.
devname="$(udevadm info -q name -p $syspath)"
Questo ci dà il percorso /dev
che corrisponde a questo /sys
dispositivo.
[[ "$devname" == "bus/"* ]] && continue
Questo filtra le cose che non sono dispositivi reali. Altrimenti otterrai cose come controller e hub USB.
eval "$(udevadm info -q property --export -p $syspath)"
Il udevadm info -q property --export
comando elenca tutte le proprietà del dispositivo in un formato che può essere analizzato dalla shell in variabili. Quindi chiediamo semplicemente eval
questo. Questo è anche il motivo per cui racchiudiamo il codice tra parentesi, in modo da utilizzare una subshell e le variabili vengono cancellate su ogni ciclo.
[[ -z "$ID_SERIAL" ]] && continue
Più filtraggio di cose che non sono dispositivi reali.
echo "/dev/$devname - $ID_SERIAL"
Spero che tu sappia cosa fa questa linea :-)
/dev
una voce inlsusb
? Oppure vuoi elencare tutti i dispositivi/dev
derivati da un dispositivo USB fisico? O vuoi solols /dev/ttyUSB*
?