天天看點

關于dd指令輸出結果無法重定向到檔案的問題

先以time為例:

time指令的輸出資訊是列印在标準錯誤輸出上的, 我們通過一個簡單的嘗試來驗證一下。

[root@web186 root]# time find . -name "mysql.sh" >1.txt 

real    0m0.081s

user    0m0.060s

sys     0m0.020s

[root@web186 root]# time find . -name "mysql.sh" 2>2.txt 

./work186/sms/bin/mysql.sh

./work186/sms/src/scripts/mysql.sh

./work186/sms/src/scripts1/mysql.sh

real    0m0.068s

user    0m0.040s

sys     0m0.030s

通過上面的嘗試,發現無法将time的輸出資訊重定向到檔案裡面,為什麼?因為time是shell的關鍵字,shell做了特殊處理,它會把time指令後面的指令行作為一個整體來進行處理,在重定向時,實際上是針對後 面的指令來的,time指令本身的輸出并不會被重定向的。那現在怎麼辦呢?網上提供了兩種解決方法【2,3】,我們一一嘗試一下。

第一種解決方法,就是将time指令和将要執行的指令行放到一個shell代碼塊中,也就是一對大括号中,要注意空格和分号的使用。 

[root@web186 root]# {time find . -name "mysql.sh"} 2>2.txt

好像成功了。慢,看一下對不對。 

[root@web186 root]# cat 2.txt 

-bash: {time: command not found

原來bash把 {time 作為一個整體來處理了,前後都加上空格試試。 

[root@web186 root]# { time find . -name "mysql.sh" } 2>2.txt 

> Ctrl+C

這次Bash認為指令都沒有輸入完成,少了分号。因為Bash認為後面的 } 是find指令的參數。 

[root@web186 root]# { time find . -name "mysql.sh"; } 2>2.txt 

./work186/sms1/bin/mysql.sh

./work186/sms1/src/scripts/mysql.sh

./temp/sms/bin/mysql.sh

./temp/sms/src/scripts/mysql.sh

user    0m0.030s

sys     0m0.040s

第一種方式的嘗試成功了,總結起來就是 { time command-line; } 2>file  注意分隔符的使用。

另外一種方式就是使用子Shell的方式,如下所示:

[root@web186 root]# (time find . -name "mysql.sh") 2>2.txt 

real    0m0.083s

[root@web186 root]# 

第二種方式的嘗試也成功了,總結起來就是 (time command-line) 2>file 這裡time緊貼着小括号(也可以的,指令行結束也不必帶分号。當然最好還是用第一種方式,畢竟啟動一個子shell是要多占些資源的。

針對dd指令。同time指令,dd指令包括了time指令。

故 dd if=/dev/zero of=/mnt/test bs=1k count=100 >>output.txt

此時并不能把dd指令顯示的時間和速度儲存到output.txt裡。因為dd指令的輸出是到标準錯誤輸出上的。

必須采用dd if=/dev/zero of=/mnt/test bs=1k count=100  2>>output.txt 才可以。

本文轉自feisky部落格園部落格,原文連結:http://www.cnblogs.com/feisky/archive/2012/04/27/2473197.html,如需轉載請自行聯系原作者