Isso se parece muito com um problema que foi discutido na lista de e-mails do Bash durante os últimos dois dias. O Bash usa o buffer de linha para saída, portanto, um printf
ou echo
que contém novas linhas no meio chama a chamada de sistema write()
para cada "linha".
$ strace -ewrite bash -c 'echo -ne "foobar"' >/dev/null
write(1, "foobar", 6) = 6
+++ exited with 0 +++
$ strace -ewrite bash -c 'echo -ne "foo\nbar\n"' >/dev/null
write(1, "foo\n", 4) = 4
write(1, "bar\n", 4) = 4
+++ exited with 0 +++
Se o dispositivo para o qual você está gravando for sensível, isso pode resultar em mais de um pacote distinto mais adiante. Uma conexão serial ou um fluxo TCP (*) não deveria se importar, mas algo mais parecido com os pacotes UDP.
Parece que você não pode contornar isso no Bash, mas você pode usar algum outro utilitário que não divida a saída para linhas no meio de um único comando de saída. Todos os outros shells que testei imprimem o acima em uma chamada write()
, e o mesmo acontece com a utilidade printf
externa do GNU coreutils. Deve estar em /usr/bin/printf
em Linuxes, então /usr/bin/printf '\x55\x90\xa\x01\xde'
deve funcionar:
$ strace -f -ewrite /usr/bin/printf '\x55\x90\xa\x01\xde' >/dev/null
write(1, "U0\n6", 5) = 5
+++ exited with 0 +++
Alternativamente, você pode canalizar a saída através de dd
, que por padrão armazena a saída em blocos de 512 (além do anterior), o que deve ser suficiente no seu caso. ( dd obs=512
para ser explícito sobre isso.)
(conexões TCP não devem se importar, mas a questão na lista foi exatamente sobre printf ... > /dev/tcp/...
. As gravações distintas podem afetar a segmentação do fluxo TCP, e aparentemente alguns hosts com bugs se preocupam com isso. )