找回密码
 注册
关于网站域名变更的通知
查看: 675|回复: 1
打印 上一主题 下一主题

如何解决dd命令输出结果无法重定向到文件的问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-3-12 09:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
先以time为例:
解决time命令输出信息的重定向问题
time命令的输出信息是打印在标准错误输出上的, 我们通过一个简单的尝试来验证一下。
[root@web186 root]# time find . -name "mysql.sh" >1.txt
6 y. V9 z' v) e1 O  p- X0 r' P: u
( N) ~0 b# c% Y& Breal    0m0.081s
: x/ l9 x9 {. }  A5 }- j7 xuser    0m0.060s0 C* B$ x7 V+ ]/ e1 z3 }$ Z+ P. o
sys     0m0.020s
% U& E5 R7 N* o7 G9 N[root@web186 root]# time find . -name "mysql.sh" 2>2.txt 6 T5 l" c  p8 [% m6 h7 S4 d  T
./work186/sms/bin/mysql.sh9 X$ x2 `4 E6 k, q
./work186/sms/src/scripts/mysql.sh: k) ~# [+ ~  j) O9 A+ V
./work186/sms/src/scripts1/mysql.sh# Y' ^9 X1 _' s# X9 h, D% k
! K  q- {) U: c7 K: P
real    0m0.068s% U6 `& P$ A: Y3 ^7 \: _
user    0m0.040s
2 ?0 j# q  f" a. ~3 b# `! Tsys     0m0.030s
通过上面的尝试,发现无法将time的输出信息重定向到文件里面,为什么?因为time是shell的关键字,shell做了特殊处理,它会把time命令后面的命令行作为一个整体来进行处理,在重定向时,实际上是针对后 面的命令来的,time命令本身的输出并不会被重定向的。那现在怎么办呢?网上提供了两种解决方法【2,3】,我们一一尝试一下。
第一种解决方法,就是将time命令和将要执行的命令行放到一个shell代码块中,也就是一对大括号中,要注意空格和分号的使用。
* e3 B4 x" ]  Y! a" ~# T8 f[root@web186 root]# {time find . -name "mysql.sh"} 2>2.txt
好像成功了。慢,看一下对不对。
8 @( I3 h  d+ [. d+ }" D. M[root@web186 root]# cat 2.txt / o2 b' m4 K) ^2 Z
-bash: {time: command not found
原来bash把 {time 作为一个整体来处理了,前后都加上空格试试。
4 U6 o+ Y/ g3 `, Q5 Q+ y[root@web186 root]# { time find . -name "mysql.sh" } 2>2.txt
: K' b  y: |" v> Ctrl+C
这次Bash认为命令都没有输入完成,少了分号。因为Bash认为后面的 } 是find命令的参数。 % c! `4 t5 H) D9 q2 Z" w
[root@web186 root]# { time find . -name "mysql.sh"; } 2>2.txt
; d8 ^6 D% W; g2 O- ?./work186/sms/bin/mysql.sh
) Z# Z: K: k8 M# d( g./work186/sms/src/scripts/mysql.sh
8 h+ h. Y1 j; m3 i./work186/sms/src/scripts1/mysql.sh& `# p) f/ V) A  k: @
./work186/sms1/bin/mysql.sh7 o. I5 X  k8 \0 Y5 w2 O1 C
./work186/sms1/src/scripts/mysql.sh
+ Q4 J& W  }; {2 S# d& H$ I# k; |1 H./temp/sms/bin/mysql.sh
; R; o3 f$ v+ ^: x./temp/sms/src/scripts/mysql.sh
/ C; R# _2 e" @  t[root@web186 root]# cat 2.txt
$ M) H  A5 J/ _( R
  S8 B# u1 E, e1 D' L% areal    0m0.068s
0 Q& @- K2 z% r8 ?user    0m0.030s
" y5 {8 a# \" D1 P. Wsys     0m0.040s
第一种方式的尝试成功了,总结起来就是 { time command-line; } 2>file  注意分隔符的使用。
另外一种方式就是使用子Shell的方式,如下所示:
[root@web186 root]# (time find . -name "mysql.sh") 2>2.txt
% J% E3 r( u7 n) Q, o( b' Y0 ?./work186/sms/bin/mysql.sh
% b/ I2 x  p9 t' m./work186/sms/src/scripts/mysql.sh
) X1 `6 e0 U7 G8 y( m./work186/sms/src/scripts1/mysql.sh9 ~3 W% g4 {" W+ g, a5 @
./work186/sms1/bin/mysql.sh
9 D* ^% F' h; Y$ A./work186/sms1/src/scripts/mysql.sh3 t) B4 d$ _1 s, S7 u  v
./temp/sms/bin/mysql.sh
2 Z" t2 j5 i8 u: C4 `+ m./temp/sms/src/scripts/mysql.sh
" M: V9 p* ]4 s* j[root@web186 root]# cat 2.txt
" |0 R! [7 R- Q* D
$ q* y# }- M% N4 F# wreal    0m0.083s" U+ K3 ^) V7 k& ~9 [+ X
user    0m0.040s
7 b$ K. H4 M1 ~0 l/ R: I" i- j1 dsys     0m0.020s
2 f1 `/ ]* z$ ~2 L3 }( Q[root@web186 root]#
第二种方式的尝试也成功了,总结起来就是 (time command-line) 2>file 这里time紧贴着小括号(也可以的,命令行结束也不必带分号。当然最好还是用第一种方式,毕竟启动一个子shell是要多占些资源的。
6 G' x' f! n6 \: l
针对dd命令。同time命令,dd命令包括了time命令。! W: ]/ N+ H/ H0 Y8 Y
6 W& m3 p. F' [* P
故 dd if=/dev/zero of=/mnt/test bs=1k count=100 >>output.txt
! q9 ?6 u* c% j% B. b  Q" t( i- d2 g9 G) U+ r5 C
此时并不能把dd命令显示的时间和速度保存到output.txt里。因为dd命令的输出是到标准错误输出上的。
0 p- y+ Q! N5 I8 \3 g2 e* S
5 l5 z+ `' r7 S  f# W5 t必须采用dd if=/dev/zero of=/mnt/test bs=1k count=100  2>>output.txt 才可以。
4 Q+ [6 n9 ~8 j; @* J2 h

该用户从未签到

2#
发表于 2020-3-12 16:21 | 只看该作者
解决dd命令输出结果无法重定向到文件的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 15:22 , Processed in 0.171875 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表