如何知道dd何时完成

如何知道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

你能输出'DD --version'? – Inian

+0

完成,我编辑。 – Lomezno

  • '\ 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 
+0

如果我直接用dd写入文件该怎么办?我会放松'null'和'\ n'吗? – Lomezno

+0

如果文件包含NUL字符(如果是二进制可能的话),只能用count = 1来检索它们,在这种情况下,c将为空[[$ c =“”]] –

+0

,因为shell变量不能包含NUL字符:'str = $(printf“hello \ 0world”);回声“$ str”| od -c' –

既然你有ifof,为什么不使用它们,

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]~# 
+0

对不起,我尝试通过串行电缆发送和接收数据,所以我需要尝试发送每字节的字节,否则我可能会丢失一些数据,这就是为什么我放了一段时间。 – Lomezno

+0

您一次发送1000个字节,而不是一个。 ** Nahuel **有适当的答案。 – evilSnobu