bash está comendo minha string

1

Considere este pequeno programa:

#!/bin/bash

ARDUINO_SERIAL=arduino-serial/arduino-serial
PORT="/dev/cu.usbmodem1421"

VERS=$($ARDUINO_SERIAL -q -b 9600 -p $PORT -S 'V' -e '\r' -r)
echo --- VERS = $VERS
B="hello${VERS}goodbye"
echo --- B = $B

FWIW, arduino-serial é um programa que envia uma string para um arduino externo e ecoa sua resposta ao stdout.

Então, eu esperaria que este pequeno roteiro produzisse:

--- VERS = 00.01
--- B = hello00.01goodbye

mas em vez disso está produzindo

--- VERS = 00.01
goodbye

Eu não entendo como o prefixo da string --- B = hello00.01 está sendo "comido" em vez de ecoar.

Alguém pode explicar o que está acontecendo e como corrigir isso?

    
por fearless_fool 09.01.2017 / 01:36

1 resposta

2

Parabéns à @steeldriver por sugerir que se tratava de um problema de terminação de linha de retorno de carro e uma dica do chapéu para @AlexP por sugerir hexdump como uma maneira de validar a teoria.

O problema é que a string retornada pelo arduino-serial tinha um '\ r \ n' à direita (também conhecido como 0x0d 0x0a), conforme evidenciado pelo hexdump:

echo "$VERS" | hexdump -C
00000000  30 30 2e 30 31 0d 0a                              |00.01..|

Uma possível correção, e a que eu escolhi, é canalizar os resultados por meio de tr -c '\r' para remover o caractere de retorno, então o script resultante fica assim:

#!/bin/bash

ARDUINO_SERIAL=arduino-serial/arduino-serial
PORT="/dev/cu.usbmodem1421"

VERS=$($ARDUINO_SERIAL -q -b 9600 -p $PORT -S 'V' -e '\r' -r | tr -d '\r')
echo --- VERS = $VERS
B="hello${VERS}goodbye"
echo --- B = $B

que imprime conforme o esperado:

--- VERS = 00.01
--- B = hello00.01goodbye
    
por 09.01.2017 / 02:47