No estoy muy seguro de lo que estás preguntando. Menciona 'puerto' varias veces, pero luego, en su ejemplo, dice que la respuesta es /dev/ttyUSB0
, que es una ruta de desarrollo del dispositivo, no un puerto. Entonces, esta respuesta se trata de encontrar la ruta de desarrollo para cada dispositivo.
A continuación se muestra un script rápido y sucio que recorre los dispositivos en /sys
busca de dispositivos USB con un ID_SERIAL
atributo. Por lo general, solo los dispositivos USB reales tendrán este atributo, por lo que podemos filtrar con él. Si no lo hacemos, verá muchas cosas en la lista que no son dispositivos físicos.
#!/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
En mi sistema, esto da como resultado lo siguiente:
/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
Explicación:
find /sys/bus/usb/devices/usb*/ -name dev
Los dispositivos que aparecen /dev
tienen un dev
archivo en su /sys
directorio. Entonces buscamos directorios que coincidan con este criterio.
syspath="${sysdevpath%/dev}"
Queremos la ruta del directorio, así que nos despojamos /dev
.
devname="$(udevadm info -q name -p $syspath)"
Esto nos da la ruta /dev
que corresponde a este /sys
dispositivo.
[[ "$devname" == "bus/"* ]] && continue
Esto filtra cosas que no son dispositivos reales. De lo contrario, obtendrá cosas como controladores USB y concentradores.
eval "$(udevadm info -q property --export -p $syspath)"
El udevadm info -q property --export
comando enumera todas las propiedades del dispositivo en un formato que el shell puede analizar en variables. Entonces simplemente llamamos eval
a esto. Esta es también la razón por la que envolvemos el código entre paréntesis, de modo que usamos un subshell y las variables se borran en cada bucle.
[[ -z "$ID_SERIAL" ]] && continue
Más filtrado de cosas que no son dispositivos reales.
echo "/dev/$devname - $ID_SERIAL"
Espero que sepas lo que hace esta línea :-)
/dev
con una entradalsusb
? ¿O desea enumerar todos los dispositivos/dev
derivados de un dispositivo USB físico? ¿O solo quieresls /dev/ttyUSB*
?