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
|