2017-06-05 142 views
1

我有一個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

  • '\ 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' –

0

既然你有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