Não tenho muita certeza do que você está perguntando. Você menciona 'porta' várias vezes, mas, em seu exemplo, diz que a resposta é /dev/ttyUSB0
: que é um caminho de desenvolvimento do dispositivo, não uma porta. Portanto, esta resposta é sobre encontrar o caminho do desenvolvedor para cada dispositivo.
Abaixo está um script rápido e sujo que percorre dispositivos na /sys
procura de dispositivos USB com um ID_SERIAL
atributo. Normalmente, apenas dispositivos USB reais terão esse atributo e, portanto, podemos filtrar com ele. Caso contrário, você verá muitas coisas na lista que não são 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
No meu sistema, isso resulta no seguinte:
/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
Explicação:
find /sys/bus/usb/devices/usb*/ -name dev
Os dispositivos que aparecem /dev
têm um dev
arquivo em seu /sys
diretório. Então, procuramos por diretórios que correspondam a esse critério.
syspath="${sysdevpath%/dev}"
Queremos o caminho do diretório, então removemos /dev
.
devname="$(udevadm info -q name -p $syspath)"
Isso nos dá o caminho /dev
que corresponde a este /sys
dispositivo.
[[ "$devname" == "bus/"* ]] && continue
Isso filtra coisas que não são dispositivos reais. Caso contrário, você terá coisas como controladores e hubs USB.
eval "$(udevadm info -q property --export -p $syspath)"
O udevadm info -q property --export
comando lista todas as propriedades do dispositivo em um formato que pode ser analisado pelo shell em variáveis. Então, simplesmente chamamos eval
isso. Essa também é a razão pela qual colocamos o código entre parênteses, para usar um subshell e as variáveis são apagadas em cada loop.
[[ -z "$ID_SERIAL" ]] && continue
Mais filtragem de coisas que não são dispositivos reais.
echo "/dev/$devname - $ID_SERIAL"
Espero que você saiba o que essa linha faz :-)
/dev
a uma entradalsusb
? Ou você deseja listar todos os dispositivos/dev
derivados de um dispositivo USB físico? Ou você está apenas querendols /dev/ttyUSB*
?