Estoy tratando de hacer algunos trucos con dd. Pensé que sería posible almacenar algunos valores hexadecimales en una variable llamada "encabezado" para canalizarlo en dd.
Mi primer paso sin una variable fue este:
$ echo -ne "\x36\xc9\xda\x00\xb4" |dd of=hex
$ hd hex
00000000 36 c9 da 00 b4 |6....|
00000005
Después de eso probé esto:
$ header=$(echo -ne "\x36\xc9\xda\x00\xb4")
$ echo -n $header | hd
00000000 36 c9 da b4 |6...|
00000004
Como puede ver, perdí mi \x00
valor en la $header
variable. ¿Alguien tiene una explicación para este comportamiento? Esto me está volviendo loco.
linux
bash
shell-script
dd
Franco
fuente
fuente
bash: warning: command substitution: ignored null byte in input
.header="$(echo -ne "\x36\xc9\xda\x00\xb4")"; echo -n "$header" | hd
sin embargo, esto solo da el mismo resultado.header="\x36\xc9\xda\x00\xb4"; echo -n "$header" | hd
, pero no es lo mismo que almacenar la forma legible por humanos.Respuestas:
No puede almacenar un byte nulo en una cadena porque Bash usa cadenas de estilo C, que reservan el byte nulo para los terminadores. Por lo tanto, debe volver a escribir su script para simplemente canalizar la secuencia que contiene el byte nulo sin que Bash necesite almacenarlo en el medio. Por ejemplo, puedes hacer esto:
Tenga en cuenta, por cierto, que no necesita
echo
; puede usar Bashprintf
para esto y muchas otras tareas simples.O en lugar de encadenar, puede usar un archivo temporal:
Por supuesto, esto tiene el problema de que el archivo
/tmp/mysequence
ya puede existir. Y ahora necesita seguir creando archivos temporales y guardar sus rutas en cadenas.O puede evitar eso utilizando la sustitución del proceso:
El
<(command)
operador crea una tubería con nombre en el sistema de archivos, que recibirá la salida decommand
.hd
recibirá, como primer argumento, la ruta a esa tubería, que abrirá y leerá casi como cualquier archivo. Puede leer más sobre esto aquí: /unix//a/17117/136742 .fuente
zsh
lo haré, pero solo en el modo nōn-POSIX.) En realidad lomksh
sh
emulación,\0
no está en el valor predeterminado de$IFS
.echo "$(printf 'a\0b')"
todavía funciona bien ensh
emulación enzsh
.En su
zsh
lugar, puede usar cuál es el único shell que puede almacenar el carácter NUL en sus variables. Ese personaje incluso está en el valor predeterminado de$IFS
inzsh
.O:
O
O
Sin embargo, tenga en cuenta que no puede pasar una variable como argumento o variable de entorno a un comando que se ejecuta ya que los argumentos y las variables de entorno son cadenas delimitadas por NUL que se pasan a la
execve()
llamada del sistema (una limitación de la API del sistema, no el shell ) Enzsh
, sin embargo, puede pasar bytes NUL como argumentos a funciones o comandos incorporados.fuente
zsh
sintaxis en tu pregunta.echo -n $header
significa pasar el contenido de la$header
variable como último argumento aecho -n
eszsh
(ofish
orc
oes
) sintaxis, nobash
sintaxis. Enbash
, eso tiene un significado muy diferente . Más generalmentezsh
es comoksh
(bash
el shell GNU, que es más o menos un clon parcial delksh
shell Unix de facto) pero con la mayoría de las idiosincrasias de diseño del shell Bourne fijadas (y muchas características adicionales y muchas más fácil de usar / menos sorprendente).echo $(printf 'ab\0cd') | od -vAn -tx1c
imprime `61 62 20 63 64 0a`, ese es un espacio donde debería existir un NUL.