Это немного сложно, но выполнимо:
function die {
print -ru2 -- "E: $*"
exit 1
}
function psubin {
local stdin=$(cat; echo .) pipe
pipe=$(mktemp /tmp/psub.XXXXXXXXXX) || die mktemp
# this is racy
rm -f "$pipe"
mkfifo "$pipe" || die mkfifo
(
# don’t block parent
exec <&- >&- 2>&-
# write content to FIFO
print -nr -- "${stdin%.}" >"$pipe"
# signal EOF to reader, ensure it’s not merged
sleep 0.1
:>"$pipe"
# clean up
(sleep 1; rm -f "$pipe") &
) &
print -nr -- "$pipe"
}
diff -u $(echo abc | psubin) $(echo def | psubin)
Проблемы, с которыми мы столкнулись здесь, следующие:
mkfifo
жалуется, если вы rm
mktemp
не выведете первые > & -
вместо > / dev / null
, и только потому, что мы можем гарантировать, что эти fds больше не будут использоваться или заменены какими-либо новыми fds) С другой стороны: хорошо, что мы делаем это сейчас, потому что в конечном итоге я захочу реализовать <(…)
в самом mksh , а затем мне нужно знать, чего следует остерегаться, поскольку мы не можем использовать / dev / fd /
, как это делает GNU bash, потому что это недостаточно переносимо.
Как правило, также будет устройство /dev/mtdblockN, по одному на каждый раздел MTD. Это блочные устройства, которые вы можете использовать с nanddump, dd, mount и т. д.
Вам нужно создать каталог точки монтирования, например, (mkdir -p /media/mnt ). Тогда это зависит от того, какую файловую систему использует ваш раздел NAND. Например, у меня есть два раздела UBIFS NAND, и я буду использовать такие команды, как:
/usr/bin/ubiattach /dev/ubi_ctrl -m <MTD_partition> -O <block_size>
/bin/mount -t ubifs ubi1:rootfs0 /media/mnt
Если раздел не имеет файловой системы (, такой как образ ядра ), то nanddump будет работать.
nanddump -f /tmp/mtd0.bin /dev/mtdblock0
Если раздел представляет собой флэш-память данных (ИЛИ ), тогда dd будет работать.
dd if=/dev/mtdblock1 of=/tmp/mtd1.bin