如何知道dd何时完成
我有一个dd命令的问题。我用它在一段时间是这样的:如何知道dd何时完成
while c=$(dd count=1000 bs=1 2>/dev/null) ;do
echo -n "$c" > /dev/ttyO5
done < $FILE
和它的作品般的魅力,唯一的问题是,一旦文件被完全读取,它不停止,同时,它在那里停留停滞不前。如果dd读取所有文件,我怎么能停下来?
顺便说一句:注意我的机器是嵌入式的linux,它没有像普通的ubuntu机器那样拥有所有的指令和工具。
感谢
输出dd --version
BusyBox v1.20.2 (MUSE) multi-call binary.
Usage: dd [if=FILE] [of=FILE] [bs=N] [count=N] [skip=N]
[seek=N]
Copy a file with converting and formatting
if=FILE Read from FILE instead of stdin
of=FILE Write to FILE instead of stdout
bs=N Read and write N bytes at a time
count=N Copy only N input blocks
skip=N Skip N input blocks
seek=N Skip N output blocks
Numbers may be suffixed by c (x1), w (x2), b (x512), kD (x1000), k (x1024),
MD (x1000000), M (x1048576), GD (x1000000000) or G (x1073741824)
注
- '\ 0' 将赋值给一个变量后丢失。
- '\\' 可以保持它的特殊含义取决于回声的版本:尽量
echo '\n'
状态可以被检索从标准错误读
dd count=1000 bs=1 </dev/null
0+0 records in
0+0 records out
所以
while
c=$(dd ... 2>errorfile);
read line <errorfile; # read the first line of error
[[ $line != 0+0* ]]; # break while if line begins with 0+0
do
...
done
这是略不同于从长度的检查c
c=$(dd count=1 bs=1 </dev/null)
echo "${#c}"
c=$(dd count=1 bs=1 <<<$'\0')
echo "${#c}"
因为在最后一种情况下读取了一个NUL字符,而在之前没有字符被读取。
编辑:下面表明,它的作品,但速度很慢:
for x in {{0..9},{a..f}}{{0..9},{a..f}}; do printf "\x$x"; done |
while
c=$(dd count=1 bs=1 2>errfile;echo .); c=${c%.}
read line <errfile
[[ $line != 0+0* ]]
do
if [[ $c = '' ]]; then printf "\0"; else echo -n -E "$c"; fi
done | od -c
如果我直接用dd写入文件该怎么办?我会放松'null'和'\ n'吗? – Lomezno
如果文件包含NUL字符(如果是二进制可能的话),只能用count = 1来检索它们,在这种情况下,c将为空[[$ c =“”]] –
,因为shell变量不能包含NUL字符:'str = $(printf“hello \ 0world”);回声“$ str”| od -c' –
既然你有if
和of
,为什么不使用它们,
test.sh:
dd if=$1 of=/dev/ttyO5 count=1000 bs=1 2>/dev/null
输出:
[email protected]~# ./test.sh file.txt
The quick brown fox jumps over the bashy dog.
[email protected]~#
你能输出'DD --version'? – Inian
完成,我编辑。 – Lomezno