Eu diria que o problema é um pouco mais difícil do que ser anunciado. Apenas analisar dmesg
para instâncias de ttyUSB*
não permitirá que você saiba se está disponível no momento. Pode ter acabado de ser desconectado.
A seguir, isso é feito observando o status atual . Ele faz isso procurando to ...
e from ...
instâncias e usa apenas aquelas em que era to ttyUSB*
no final da linha.
dmesg | tac | awk '$NF~/ttyUSB[0-9]+/ && !a[$NF]++ && $(NF-1)=="to" {print $NF}'
Para explicar rapidamente:
-
tac
inverte a entrada, então estamos lidando com a primeira mais recente
-
$NF ~ /ttyUSB[0-9]+/
é uma regex que verifica se o último campo é um ttyUSB*
-
!a[$NF]++
verifica se não vimos este campo antes
-
$(NF-1) == "to"
filtra no penúltimo campo para garantir que estamos lidando com to ...
linhas.
Para testar isso, simplesmente peguei sua saída e removi o segundo anexo. No meu exemplo ttyUSB2 foi conectado, desconectado e nunca reconectado. Não deveria estar disponível.
$ cat testdmesg
[ 7.648896] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB0
[ 7.649091] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB1
[ 7.649502] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB2
[17406.327030] option1 ttyUSB0: GSM modem (1-port) converter now disconnected from ttyUSB0
[17406.329670] option1 ttyUSB1: GSM modem (1-port) converter now disconnected from ttyUSB1
[17406.334036] option1 ttyUSB2: GSM modem (1-port) converter now disconnected from ttyUSB2
[90128.405694] usb 1-4: GSM modem (1-port) converter now attached to ttyUSB0
[90128.405987] usb 1-4: GSM modem (1-port) converter now attached to ttyUSB1
[90132.905458] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB3
[90132.905791] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB4
[90132.906541] usb 1-2: GSM modem (1-port) converter now attached to ttyUSB5
[90148.661532] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB6
[90148.661828] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB7
[90148.662440] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB8
$ tac testdmesg | awk '$NF~/ttyUSB[0-9]+/ && !a[$NF]++ && $(NF-1)=="to" {print $NF}'
ttyUSB8
ttyUSB7
ttyUSB6
ttyUSB5
ttyUSB4
ttyUSB3
ttyUSB1
ttyUSB0
E, claro, você pode passar por sort
, se quiser. Você não deveria precisar de uniq
(ou sort -u
), já que o awk já deveria ter manipulado dupes.