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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
先以time为例:
解决time命令输出信息的重定向问题
time命令的输出信息是打印在标准错误输出上的, 我们通过一个简单的尝试来验证一下。
[root@web186 root]# time find . -name "mysql.sh" >1.txt , c6 h  V% q1 x

# l3 W3 F$ l9 K* \6 c9 _4 G* [real    0m0.081s
6 i5 P$ D4 X- e) vuser    0m0.060s
1 B8 _( N5 P/ w  O- }sys     0m0.020s7 |! s6 y  x- u1 q
[root@web186 root]# time find . -name "mysql.sh" 2>2.txt
# a0 d1 T2 n* V# ?, j) I* x' |./work186/sms/bin/mysql.sh/ x, f% i, O, B$ q/ E
./work186/sms/src/scripts/mysql.sh' |5 F3 n# B( P( B" p
./work186/sms/src/scripts1/mysql.sh
4 D9 k; O+ L3 T
- j9 S5 c2 ]( S5 ~+ Sreal    0m0.068s
8 o* @' n: ]5 d9 k0 `user    0m0.040s1 ?" [- Y  f$ D0 O& R
sys     0m0.030s
通过上面的尝试,发现无法将time的输出信息重定向到文件里面,为什么?因为time是shell的关键字,shell做了特殊处理,它会把time命令后面的命令行作为一个整体来进行处理,在重定向时,实际上是针对后 面的命令来的,time命令本身的输出并不会被重定向的。那现在怎么办呢?网上提供了两种解决方法【2,3】,我们一一尝试一下。
第一种解决方法,就是将time命令和将要执行的命令行放到一个shell代码块中,也就是一对大括号中,要注意空格和分号的使用。 4 R4 T& u0 m9 W* a4 n/ s7 [9 N; l
[root@web186 root]# {time find . -name "mysql.sh"} 2>2.txt
好像成功了。慢,看一下对不对。 % @) G$ m# e+ A
[root@web186 root]# cat 2.txt
9 e/ o7 V& M9 m5 R- W-bash: {time: command not found
原来bash把 {time 作为一个整体来处理了,前后都加上空格试试。
: q9 a$ V$ N! B5 P* C: c) X[root@web186 root]# { time find . -name "mysql.sh" } 2>2.txt
6 A  p& x9 p. z: M> Ctrl+C
这次Bash认为命令都没有输入完成,少了分号。因为Bash认为后面的 } 是find命令的参数。 , ~) {2 I% Z  @
[root@web186 root]# { time find . -name "mysql.sh"; } 2>2.txt
% N2 s' }, Y1 D  K2 z6 q$ n, Q./work186/sms/bin/mysql.sh/ b) ?( U; Y$ o7 }) d6 s
./work186/sms/src/scripts/mysql.sh
5 c5 ?/ h( d* a5 Y5 z4 u0 n# j./work186/sms/src/scripts1/mysql.sh! m8 Z. ]5 i0 i9 a: b7 u
./work186/sms1/bin/mysql.sh
2 [" D/ K# V9 z8 c" L9 u, i./work186/sms1/src/scripts/mysql.sh& z# y! w- @5 R. H% p
./temp/sms/bin/mysql.sh
  N2 d, @7 W1 `- p5 b+ `& _6 b  M./temp/sms/src/scripts/mysql.sh
0 P0 g# o! u/ b, ?. E) o. }[root@web186 root]# cat 2.txt 6 @; i0 z' Z: X' o/ w
0 o+ R' {% v/ z0 H( T5 d% r, l5 u; @
real    0m0.068s
+ i! k5 B" Y2 [) ?! h% V  Puser    0m0.030s
( Q- S1 B; k7 V6 G# _sys     0m0.040s
第一种方式的尝试成功了,总结起来就是 { time command-line; } 2>file  注意分隔符的使用。
另外一种方式就是使用子Shell的方式,如下所示:
[root@web186 root]# (time find . -name "mysql.sh") 2>2.txt
2 y9 s8 Z% X* o' ]7 ^% ]./work186/sms/bin/mysql.sh
5 A6 p6 O: @; U- t& W! K! _" W./work186/sms/src/scripts/mysql.sh
' k6 ]0 @( D  I$ p./work186/sms/src/scripts1/mysql.sh
$ J) M4 Y. }8 U( `  z* K./work186/sms1/bin/mysql.sh
" t$ m+ N6 ~' R: L./work186/sms1/src/scripts/mysql.sh8 n) t9 |9 v  v" X
./temp/sms/bin/mysql.sh4 C, X+ A& }/ f- ^8 `) ]% {6 [, ]
./temp/sms/src/scripts/mysql.sh7 D3 M: b5 n6 r# ^) g
[root@web186 root]# cat 2.txt ! P3 y+ l0 h. L" _8 `, P; A& n
* t% p$ @7 Y" h( k) _: u6 z4 L7 b3 m& L
real    0m0.083s7 G! o9 O6 u! O8 k& o: a' Y, b
user    0m0.040s! {" m- `, u* y$ o! l
sys     0m0.020s
$ u! s9 f$ g# E+ C[root@web186 root]#
第二种方式的尝试也成功了,总结起来就是 (time command-line) 2>file 这里time紧贴着小括号(也可以的,命令行结束也不必带分号。当然最好还是用第一种方式,毕竟启动一个子shell是要多占些资源的。

% [% P9 D' O! S& W
针对dd命令。同time命令,dd命令包括了time命令。7 ^& E( o. I4 S. i; c- ]

  ~7 C% e! ]7 }' I& z6 v0 J& B$ j4 D1 p5 B故 dd if=/dev/zero of=/mnt/test bs=1k count=100 >>output.txt: E' h0 B$ t+ g, ^% p

6 [/ a* c9 m0 l6 A7 Y+ u4 r此时并不能把dd命令显示的时间和速度保存到output.txt里。因为dd命令的输出是到标准错误输出上的。
. q+ \7 C3 T8 _3 H% w( v- A& _( W" H; L% E) Y# z! X
必须采用dd if=/dev/zero of=/mnt/test bs=1k count=100  2>>output.txt 才可以。
/ o; m8 T& j+ t

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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