Sí, eso es exactamente lo que sucede:
$ mkfifo p
$ while :; do cat p ; done > /dev/null &
$ strace -etrace=open,close bash -c 'echo -n foo > p; echo bar > p' |& grep '"p"' -A1
open("p", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
close(3) = 0
--
open("p", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
close(3) = 0
Las redirecciones solo surten efecto mientras dura el único comando en el que están configuradas. La solución en el lado de escritura es a )usar un bloque compuesto para agrupar los comandos, o b )usar exec
para abrir un descriptor de archivo durante todo el script (o hasta que se cierre ).
un)
{ echo -n foo; echo bar; } > p
(También puede poner los comandos en una función y usar la redirección al llamar a la función.)
b)
exec 3>p
echo -n foo >&3
echo bar >&3
exec 3>&- # to explicitly close it
Si desea corregirlo en el lado de la lectura, deberá recorrer read
y concatenar las cadenas que obtenga. Dado que desea explícitamente líneas parciales que no sean -, y para omitir el final -de las condiciones del archivo -, no puede usar el código de salida de read
para nada útil.
Установитьu-boot-tools
:
$ sudo apt install u-boot-tools
Изучите заголовок изображения:
$ dumpimage -l boot.scr.uimg
Image Name:
Created: Wed Dec 31 16:00:00 1969
Image Type: ARM Linux Script (uncompressed)
Data Size: 1489 Bytes = 1.45 KiB = 0.00 MiB
Load Address: 00000000
Entry Point: 00000000
Contents:
Image 0: 1481 Bytes = 1.45 KiB = 0.00 MiB
Извлеките файл boot.scr
из образа:
$ dumpimage -i boot.scr.uimg boot.scr
Извлеченный файл на 8 байт больше, чем указано в таблице Contents
в заголовке, 1489 байт против ожидаемых 1481. Если хотите, вы можете обрезать эти байты с помощью:
tail -c+8 boot.scr > $$; mv $$ boot.scr
Изменить:в отношении OP @Bumsik Kim и эксперта-рецензента @Kusalananda, было предложено изменить синтаксис dumpimage
на:
dumpimage -o boot.scr boot.scr.uimg
Я включу это примечание сюда на случай, если оно будет кому-то полезно, но в системе Ubuntu 18.04 эта команда выполняется успешно, но ничего не делает:
# ls -l
total 4
-rw------- 1 root root 1553 Aug 7 11:30 boot.scr.uimg
# dumpimage -o boot.scr boot.scr.uimg && ls -l
total 4
-rw------- 1 root root 1553 Aug 7 11:30 boot.scr.uimg
Исходный синтаксис выше работает в Ubuntu 18:
$ dumpimage -i boot.scr.uimg boot.scr && ls -l
total 8
-rw------- 1 root root 1489 Aug 9 10:51 boot.scr
-rw------- 1 root root 1553 Aug 7 11:30 boot.scr.uimg
Тем не менее, я хочу включить предложенный ими синтаксис и подтвердить его.