Estou trabalhando com uma instalação Linux embarcada emparelhada que não suporta bash, apenas sh em um terminal ssh. Preciso enviar dados hexadecimais para um dispositivo USB conectado /dev/ttyUSB0
. Eu sou capaz de fazer isso com bastante facilidade com bash (em uma instalação de desktop do Ubuntu 18.04) usando echo -en '\x01\x02\x03' > /dev/ttyUSB0
, mas parece que os escapes de barra invertida não são suportados pelo sh. Existe outra maneira relativamente fácil (ou mesmo não tão fácil) de fazer isso com sh?
Infelizmente, $SHELL --version
não está retornando nada. A versão do kernel é 4.1.0.
Esta é uma das razões pelas quais printf é melhor que echo . As implementações de
echo
variam em se e como suportam opções e escapes de barra invertida, mas todas as versõesprintf
devem suportar escapes de barra invertida.O único problema é que apenas escapes octais, como
\001
são padrão,\x01
podem não estar disponíveis em todos os lugares, mesmo comprintf
. Mas você pode começar tentandoprintf "\x01"
.Se isso não funcionar, você terá que mudar para octal. Faça a conversão off-line com a calculadora de qualquer programador ou use algo como
printf "%o\n" "0x61"
para converter ou use algo assim para converter em lote sua string:(deve dar
foo\001\141
)Você está misturando barra
/
e barra invertida\
.O escape é feito com barra invertida:
No final, usei meu desktop Ubuntu para criar arquivos binários.
Então, depois de copiar o arquivo binário para o meu sistema executando o shell ash, eu cato esse arquivo no meu script para o USB.
Seria bom se houvesse uma maneira melhor de fazer isso, sem a etapa intermediária de criar um conjunto de arquivos binários, mas isso funcionará por enquanto.