EDA365电子论坛网
标题: 如何解决dd命令输出结果无法重定向到文件的问题 [打印本页]
作者: thinkfunny 时间: 2020-3-12 09:23
标题: 如何解决dd命令输出结果无法重定向到文件的问题
先以time为例:
解决time命令输出信息的重定向问题time命令的输出信息是打印在标准错误输出上的, 我们通过一个简单的尝试来验证一下。
[root@web186 root]# time find . -name "mysql.sh" >1.txt / Q8 g. V/ {' [8 y3 s
% P: y, Y9 F0 ~# x: sreal 0m0.081s
* y( ?5 Z, n% k- ouser 0m0.060s5 _' K" d/ P1 V9 [. I# c! `
sys 0m0.020s7 t- T. M- F& b* q+ v4 K, R
[root@web186 root]# time find . -name "mysql.sh" 2>2.txt
! m$ a/ G K. c./work186/sms/bin/mysql.sh
3 l: I7 D) |& R! M3 @5 c A# V./work186/sms/src/scripts/mysql.sh
* ?. u/ }3 R- |) x7 A, a# ~7 C2 [./work186/sms/src/scripts1/mysql.sh
" B: \! I" j: w6 y
( Y9 P/ b. ]4 J1 p" ~# `0 Dreal 0m0.068s* Q$ A% Z. a9 }
user 0m0.040s" ?$ j! W5 q2 C6 c1 X; h
sys 0m0.030s
通过上面的尝试,发现无法将time的输出信息重定向到文件里面,为什么?因为time是shell的关键字,shell做了特殊处理,它会把time命令后面的命令行作为一个整体来进行处理,在重定向时,实际上是针对后 面的命令来的,time命令本身的输出并不会被重定向的。那现在怎么办呢?网上提供了两种解决方法【2,3】,我们一一尝试一下。
第一种解决方法,就是将time命令和将要执行的命令行放到一个shell代码块中,也就是一对大括号中,要注意空格和分号的使用。
3 `/ S0 g$ F+ [; ~* l: K5 q) R[root@web186 root]# {time find . -name "mysql.sh"} 2>2.txt
好像成功了。慢,看一下对不对。 , c0 E! p# c H( D, K! @
[root@web186 root]# cat 2.txt - P& W, l. H! g3 C3 [* {
-bash: {time: command not found
原来bash把 {time 作为一个整体来处理了,前后都加上空格试试。
7 n/ `. n! U+ R$ Z3 {4 m[root@web186 root]# { time find . -name "mysql.sh" } 2>2.txt
6 p" P. |0 F2 Q> Ctrl+C
这次Bash认为命令都没有输入完成,少了分号。因为Bash认为后面的 } 是find命令的参数。 , y8 O4 k/ P1 e+ _' M a& J+ b! j
[root@web186 root]# { time find . -name "mysql.sh"; } 2>2.txt
6 e1 d0 g, Y( g8 q0 k- }./work186/sms/bin/mysql.sh
7 X, W9 J0 ^& X+ i% ?1 j6 y./work186/sms/src/scripts/mysql.sh/ `5 r) j, [, v, ?
./work186/sms/src/scripts1/mysql.sh2 _7 j! w, n8 }! k7 j2 U
./work186/sms1/bin/mysql.sh
& u8 P$ z$ u3 r1 k7 x./work186/sms1/src/scripts/mysql.sh* a3 Q4 T0 _* m
./temp/sms/bin/mysql.sh
' I d5 H( q8 V5 s8 ?& Z& Y./temp/sms/src/scripts/mysql.sh, D3 @" @' Z' M/ g( @; X
[root@web186 root]# cat 2.txt , z8 D7 z- f4 C5 {0 y
; q1 O, U* I8 b8 Ireal 0m0.068s$ T8 m1 [; M3 D' q+ n* E
user 0m0.030s
' U1 G5 C) u( O7 n9 nsys 0m0.040s
第一种方式的尝试成功了,总结起来就是 { time command-line; } 2>file 注意分隔符的使用。
另外一种方式就是使用子Shell的方式,如下所示:
[root@web186 root]# (time find . -name "mysql.sh") 2>2.txt 7 Q8 m1 X- l7 }. q6 [
./work186/sms/bin/mysql.sh
2 g/ A* }* p& I: D, [4 ?0 J./work186/sms/src/scripts/mysql.sh5 n( |0 ]! l# Q# g
./work186/sms/src/scripts1/mysql.sh
4 F* W7 s8 Q& |./work186/sms1/bin/mysql.sh
$ [# a& g/ y8 R# R4 i* b./work186/sms1/src/scripts/mysql.sh
. G3 L0 q+ P" ~7 a$ i+ s./temp/sms/bin/mysql.sh
2 L H: @# T" d+ }/ F- R+ B# Q/ a./temp/sms/src/scripts/mysql.sh
- P/ l: b2 ^. Z. L- |[root@web186 root]# cat 2.txt " ?4 A; M, A5 t- \0 m6 Z) K
. b# A E6 @' j7 ]; Ereal 0m0.083s7 w9 a5 R2 ?4 o1 Y
user 0m0.040s. t1 O( R1 B9 G: L- f9 S% \! P
sys 0m0.020s/ t* I! U) j% h+ j m' ^& y' y
[root@web186 root]#
第二种方式的尝试也成功了,总结起来就是 (time command-line) 2>file 这里time紧贴着小括号(也可以的,命令行结束也不必带分号。当然最好还是用第一种方式,毕竟启动一个子shell是要多占些资源的。
8 O2 X5 U/ y, O) I6 Y4 K0 X8 h" X4 ]/ u针对dd命令。同time命令,dd命令包括了time命令。$ _( {( m' s7 f% v+ }# @
0 W/ f( ?6 M X3 Z
故 dd if=/dev/zero of=/mnt/test bs=1k count=100 >>output.txt
* h' B4 f! x- z; ], i& ~3 I$ q# y) W
此时并不能把dd命令显示的时间和速度保存到output.txt里。因为dd命令的输出是到标准错误输出上的。( I- n# m; d* J7 s! X+ [
% ?1 k* N' ?: G
必须采用dd if=/dev/zero of=/mnt/test bs=1k count=100 2>>output.txt 才可以。
7 r2 Q7 r' Y" `2 ~. r0 i8 }2 X
作者: CCxiaom 时间: 2020-3-12 16:21
解决dd命令输出结果无法重定向到文件的问题
| 欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) |
Powered by Discuz! X3.2 |