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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
先以time为例:
解决time命令输出信息的重定向问题
time命令的输出信息是打印在标准错误输出上的, 我们通过一个简单的尝试来验证一下。
[root@web186 root]# time find . -name "mysql.sh" >1.txt
0 r* V  R7 |4 W7 A% P: B5 I
8 A6 W) H0 Z/ Preal    0m0.081s- L- D  y% d# B( p% i
user    0m0.060s
& {3 I4 e7 ~8 s% Msys     0m0.020s' Z) H/ }, Q. y) @5 k! [
[root@web186 root]# time find . -name "mysql.sh" 2>2.txt
9 l1 l& I5 j5 o& \6 Q* C' ]./work186/sms/bin/mysql.sh
" i- J1 R, l& K( D* e' t7 [./work186/sms/src/scripts/mysql.sh
9 N, n% j) X- g+ S4 A! I! E" b./work186/sms/src/scripts1/mysql.sh
, [* p+ M0 z+ D; u
. W, g, j/ q# G9 y4 y' Qreal    0m0.068s! B+ ~- _. x' V
user    0m0.040s0 M8 w: o2 T: y
sys     0m0.030s
通过上面的尝试,发现无法将time的输出信息重定向到文件里面,为什么?因为time是shell的关键字,shell做了特殊处理,它会把time命令后面的命令行作为一个整体来进行处理,在重定向时,实际上是针对后 面的命令来的,time命令本身的输出并不会被重定向的。那现在怎么办呢?网上提供了两种解决方法【2,3】,我们一一尝试一下。
第一种解决方法,就是将time命令和将要执行的命令行放到一个shell代码块中,也就是一对大括号中,要注意空格和分号的使用。
) v. m2 h$ V$ n* f+ x) z3 r2 K[root@web186 root]# {time find . -name "mysql.sh"} 2>2.txt
好像成功了。慢,看一下对不对。
: n" l2 @$ i. B4 H; q" I, S[root@web186 root]# cat 2.txt
- v0 i, t: Q' p; R7 p/ [-bash: {time: command not found
原来bash把 {time 作为一个整体来处理了,前后都加上空格试试。 . h0 V3 P2 d' y* C- P% A/ Z
[root@web186 root]# { time find . -name "mysql.sh" } 2>2.txt 9 N3 P7 o* ^5 Z- p0 c. z
> Ctrl+C
这次Bash认为命令都没有输入完成,少了分号。因为Bash认为后面的 } 是find命令的参数。 # X( t' \& l2 u0 C6 E: i: K
[root@web186 root]# { time find . -name "mysql.sh"; } 2>2.txt
& k- [! l* G/ N+ m6 |" T./work186/sms/bin/mysql.sh
$ M% Q) w0 h  J3 {./work186/sms/src/scripts/mysql.sh
- Y9 F7 T6 q+ ^+ i* e. ^. ]./work186/sms/src/scripts1/mysql.sh4 j! w& a4 D. o8 s2 s
./work186/sms1/bin/mysql.sh
, c- J# p4 e% H  M5 K./work186/sms1/src/scripts/mysql.sh3 h' E$ m+ N* G1 e
./temp/sms/bin/mysql.sh: G. D  C; E1 O  ?8 m
./temp/sms/src/scripts/mysql.sh& ?4 e! u, ~8 c3 p* d/ K( |$ l
[root@web186 root]# cat 2.txt
2 R2 d9 `- E' Z+ }$ _. }. D4 v# ~$ H& `+ K5 p
real    0m0.068s
( h: R/ ~5 `! U  y5 S& o2 p* Iuser    0m0.030s
3 C, _; g# \2 p3 a  J3 Psys     0m0.040s
第一种方式的尝试成功了,总结起来就是 { time command-line; } 2>file  注意分隔符的使用。
另外一种方式就是使用子Shell的方式,如下所示:
[root@web186 root]# (time find . -name "mysql.sh") 2>2.txt 8 [2 P0 J0 r" V6 O
./work186/sms/bin/mysql.sh( G1 ?! G( r1 G; O3 |$ M( ~% a+ m$ l
./work186/sms/src/scripts/mysql.sh
& \. G& O5 \2 j1 ^: [. M./work186/sms/src/scripts1/mysql.sh2 E: I0 t$ h9 m3 [2 L* B4 Y7 V* h
./work186/sms1/bin/mysql.sh
! t+ A8 l5 y0 u, M. w4 y$ s0 \./work186/sms1/src/scripts/mysql.sh
0 ]  ?* q6 V! ?! k7 g7 w- _./temp/sms/bin/mysql.sh" \$ n. G$ J' P5 v2 T
./temp/sms/src/scripts/mysql.sh( T1 U7 I: \! o1 m! S
[root@web186 root]# cat 2.txt
2 |& U, e' p/ P. c( E% I
3 v: s' j5 y8 a0 ?) w0 dreal    0m0.083s3 ~; W% W  R3 {1 c, [7 a
user    0m0.040s' s9 }* z, D3 e& g8 s: O
sys     0m0.020s
, E6 A0 H" E* _, B0 _[root@web186 root]#
第二种方式的尝试也成功了,总结起来就是 (time command-line) 2>file 这里time紧贴着小括号(也可以的,命令行结束也不必带分号。当然最好还是用第一种方式,毕竟启动一个子shell是要多占些资源的。
) s% g4 Z5 `. u2 c0 \* y! h
针对dd命令。同time命令,dd命令包括了time命令。' s/ m8 U1 A! B! ]# F
5 o& }7 O0 P) o7 L- g2 [
故 dd if=/dev/zero of=/mnt/test bs=1k count=100 >>output.txt
# }0 f5 b, D0 N2 z8 K1 d
* D2 I+ y0 u% e0 `& R此时并不能把dd命令显示的时间和速度保存到output.txt里。因为dd命令的输出是到标准错误输出上的。
. K# b: u6 B1 N$ B) a6 u
$ @0 D3 Y, R1 M+ d必须采用dd if=/dev/zero of=/mnt/test bs=1k count=100  2>>output.txt 才可以。
8 M. u7 ]! K+ B4 R

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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