Estoy intentando conectar mi Rasberry Pi a alguna pantalla usando el bus i2c. Para empezar quería escribir manualmente cosas, bytes en particular a un archivo. https://unix.stackexchange.com/questions/55767/how-do-you-write-specific-bytes-to-a-file Ya leí ese y supuse que mi problema se resolvería con algo como esto
echo -n -e \x66\x6f\x6f > byteFileForNow
Sin embargo, cuando abro ese archivo con nano, en lugar de foo veo:
x66x6fx6f
Así que se escaparon las barras invertidas, pero no los bytes en sí. También intenté lo mismo pero sin la -e esta vez, así que esperaba ver \x66\x6f\x6f, pero obtuve lo mismo que antes.
Así que echo está escapando barras invertidas, barras invertidas solas y barras invertidas sin tener en cuenta si se supone que debe hacerlo.
¿Alguna idea de cómo arreglar esto?
De acuerdo con la página man que debería hacer lo que estoy buscando.
Puede que esto no responda directamente a la pregunta, pero también puedes usar vi
en modo hexadecimal:
Abra su archivo y escriba:
ESC :%!xxd
para cambiar al modo hexadecimal.
Podrás editar la parte hexadecimal (la parte de texto no se actualizará cuando cambies la parte hexadecimal).
Cuando hayas terminado pulsa escape de nuevo y escribe:
ESC :%!xxd -r
para volver a escribir los cambios que hiciste en modo hexadecimal (no olvides guardar después).
Hay mucha información en el manual en línea de cada comando; siempre merece la pena echarle un vistazo antes de rendirse y publicar una pregunta.
El manual echo explica qué secuencias de escape están permitidas. He aquí un extracto.
Si -e está en efecto, las siguientes secuencias son reconocidas:
\0NNN el carácter cuyo código ASCII es NNN (octal) > Barra invertida > \a alerta (BEL) > \b retroceso > \c no producir más salida > \f form feed > \n nueva línea > \r retorno de carro > \t tab horizontal > \v tab vertical
Así que \x86 es simplemente incorrecto. debe ser octal y poner su cadena entre comillas dobles, de lo contrario será interpretado por el shell.
Ejemplo:
$ echo -e -n "\033\07\017" >tf
$ od -c tf
0000000 033 \a 017
0000003
Edición 1
Como Ouki me recordó, echo es también un shell builtin, así que la información está en la página del manual de bash, man bash
; aquí'está la sección relevante. Pero usa comillas "
alrededor de tu cadena para evitar que el shell interprete las barras invertidas.
echo [-neE] [arg ...] Envía los argumentos, separados por espacios, seguidos de una nueva línea. El estado de retorno es siempre 0. Si se especifica -n, se suprime la nueva línea final. Si se especifica la opción -e se habilita la interpretación de los siguientes caracteres con barra invertida. La opción -E desactiva la interpretación de estos caracteres de escape, incluso en sistemas en los que se interpretan por defecto. interpretados por defecto. La opción de shell xpg_echo puede utilizarse para determinar dinámicamente si echo expande o no estos caracteres de escape por defecto. echo no interpreta -- para significar el final de las opciones. echo interpreta las siguientes secuencias de escape: \a alerta (campana) \b retroceso \c suprimir más salida \e un caracter de escape \f form feed \n nueva línea \r retorno de carro \t tab horizontal \v tab vertical Barra invertida \0nnn el carácter de ocho bits cuyo valor es el valor octal nnn (de cero a tres octales dig- su) el carácter de ocho bits cuyo valor es el valor hexadecimal HH (uno o dos dígitos hexadecimales). su)