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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
先以time为例:
解决time命令输出信息的重定向问题
time命令的输出信息是打印在标准错误输出上的, 我们通过一个简单的尝试来验证一下。
[root@web186 root]# time find . -name "mysql.sh" >1.txt
! |0 N8 B0 D$ ]0 C! G
( U9 d' e: M% Ereal    0m0.081s
8 o( }2 ]0 |+ ruser    0m0.060s
* F& X0 a) p% Y+ |3 R, _' vsys     0m0.020s" L& W, r* Y" i/ f, U
[root@web186 root]# time find . -name "mysql.sh" 2>2.txt
$ ]0 |& x% f3 ^0 @  `& n./work186/sms/bin/mysql.sh
' ?' F- J- M: z4 z./work186/sms/src/scripts/mysql.sh
# r; y0 |& S  j1 _% w. h./work186/sms/src/scripts1/mysql.sh* V, X6 v9 l) q0 m& j3 h

8 ?2 N; `; B- Lreal    0m0.068s* D4 l# n" f, o/ A+ v+ i9 X$ h' r
user    0m0.040s
; K2 Q) U; ^! v1 f+ Y4 J% tsys     0m0.030s
通过上面的尝试,发现无法将time的输出信息重定向到文件里面,为什么?因为time是shell的关键字,shell做了特殊处理,它会把time命令后面的命令行作为一个整体来进行处理,在重定向时,实际上是针对后 面的命令来的,time命令本身的输出并不会被重定向的。那现在怎么办呢?网上提供了两种解决方法【2,3】,我们一一尝试一下。
第一种解决方法,就是将time命令和将要执行的命令行放到一个shell代码块中,也就是一对大括号中,要注意空格和分号的使用。 + X3 \5 W- j$ H5 H( u  n
[root@web186 root]# {time find . -name "mysql.sh"} 2>2.txt
好像成功了。慢,看一下对不对。 1 d3 d) v& X8 C! Y( [% w  j
[root@web186 root]# cat 2.txt $ y& L  z0 Q2 R% y& w6 F0 e
-bash: {time: command not found
原来bash把 {time 作为一个整体来处理了,前后都加上空格试试。 - r8 [0 P5 t. b
[root@web186 root]# { time find . -name "mysql.sh" } 2>2.txt 6 {$ k  A7 D. t1 s
> Ctrl+C
这次Bash认为命令都没有输入完成,少了分号。因为Bash认为后面的 } 是find命令的参数。
) n7 D* U1 w* f# U" Z1 Z[root@web186 root]# { time find . -name "mysql.sh"; } 2>2.txt ( }5 }8 ~( Z! R' R0 r, ]
./work186/sms/bin/mysql.sh1 R; d9 c- p3 l0 J7 F) V4 Q
./work186/sms/src/scripts/mysql.sh
; B( r; d, z5 r+ ]. q/ U./work186/sms/src/scripts1/mysql.sh
. p$ W0 C* }- V& i6 h/ Y0 s& \4 k./work186/sms1/bin/mysql.sh) r: y  ]; v" m
./work186/sms1/src/scripts/mysql.sh
$ V- F9 @$ E1 I, G; Z! m  ?: r./temp/sms/bin/mysql.sh
' S: u6 h' e- V. X- [./temp/sms/src/scripts/mysql.sh
+ f3 z5 u1 u* e4 ^( _& Y$ h[root@web186 root]# cat 2.txt
7 m+ b- k* P3 }' [) C! `$ C; D  \4 Y6 V( F5 w& k5 J
real    0m0.068s
% Q+ E4 @4 L6 V+ i6 _# x0 @7 \user    0m0.030s8 j  x) R: g6 F: m  |8 n
sys     0m0.040s
第一种方式的尝试成功了,总结起来就是 { time command-line; } 2>file  注意分隔符的使用。
另外一种方式就是使用子Shell的方式,如下所示:
[root@web186 root]# (time find . -name "mysql.sh") 2>2.txt
9 E" u% _! q$ j* v# U8 w1 F./work186/sms/bin/mysql.sh9 w- M! ?3 W, a0 b* W3 P$ H1 {
./work186/sms/src/scripts/mysql.sh
- {3 H! @' u. t. I8 v./work186/sms/src/scripts1/mysql.sh
, b" }9 R3 j4 m  B& o./work186/sms1/bin/mysql.sh
9 R% q! {6 P" h./work186/sms1/src/scripts/mysql.sh
4 W$ X- K8 ?" H  z$ }3 S# X; G+ P./temp/sms/bin/mysql.sh
6 B: i* ^; o% d: ^& m$ T./temp/sms/src/scripts/mysql.sh
: n! A! x0 }* Y( Y) l0 M8 [[root@web186 root]# cat 2.txt % G5 m$ G: |7 J$ I6 h5 g, E

6 \- _+ a5 C8 J% greal    0m0.083s/ v( H. Y" g! ^7 T
user    0m0.040s1 [  N7 w- r* H  V7 z. X! t/ t
sys     0m0.020s  G1 U& h4 o4 _+ G' V3 T# [( Q
[root@web186 root]#
第二种方式的尝试也成功了,总结起来就是 (time command-line) 2>file 这里time紧贴着小括号(也可以的,命令行结束也不必带分号。当然最好还是用第一种方式,毕竟启动一个子shell是要多占些资源的。

+ w* h9 p. z; w- e
针对dd命令。同time命令,dd命令包括了time命令。6 w3 _1 ^& D1 s3 N4 Z

, H8 }! N1 _! e/ ~2 c9 B故 dd if=/dev/zero of=/mnt/test bs=1k count=100 >>output.txt* O; m3 r' Y/ ?. N2 Z. I* e3 [
% _9 `5 p8 A5 E- b3 }& U
此时并不能把dd命令显示的时间和速度保存到output.txt里。因为dd命令的输出是到标准错误输出上的。
# h8 C5 _7 z; G/ t. U# }6 D; z2 V' M4 L9 P0 k" s' S% C2 o
必须采用dd if=/dev/zero of=/mnt/test bs=1k count=100  2>>output.txt 才可以。
/ W* l1 p- g9 u0 E$ a. F

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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