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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
先以time为例:
解决time命令输出信息的重定向问题
time命令的输出信息是打印在标准错误输出上的, 我们通过一个简单的尝试来验证一下。
[root@web186 root]# time find . -name "mysql.sh" >1.txt # q" K1 k- y) p
7 X! H  t( t* X% W
real    0m0.081s
! A" ]8 o- b' h$ Fuser    0m0.060s
  R4 U6 [9 y3 Z- W, fsys     0m0.020s
) D5 l: `6 D* |2 \7 r$ X% u[root@web186 root]# time find . -name "mysql.sh" 2>2.txt 5 R. u  R$ O$ x, ^# a  z
./work186/sms/bin/mysql.sh
1 j. c6 y: J; G: A: Y./work186/sms/src/scripts/mysql.sh
" g# G+ r7 t1 I4 a  M  y( R' r, L8 E./work186/sms/src/scripts1/mysql.sh
! u- K# `( d& B. I  y& t
, N) G9 m5 j5 u7 W2 mreal    0m0.068s
* a5 M6 _5 g' I, n0 B# _9 Luser    0m0.040s  j  g( U& A) M' h/ f
sys     0m0.030s
通过上面的尝试,发现无法将time的输出信息重定向到文件里面,为什么?因为time是shell的关键字,shell做了特殊处理,它会把time命令后面的命令行作为一个整体来进行处理,在重定向时,实际上是针对后 面的命令来的,time命令本身的输出并不会被重定向的。那现在怎么办呢?网上提供了两种解决方法【2,3】,我们一一尝试一下。
第一种解决方法,就是将time命令和将要执行的命令行放到一个shell代码块中,也就是一对大括号中,要注意空格和分号的使用。
3 Q- ?! U1 g6 _1 |5 L& o4 N[root@web186 root]# {time find . -name "mysql.sh"} 2>2.txt
好像成功了。慢,看一下对不对。
7 C" {+ b. H2 }4 g1 C+ ~[root@web186 root]# cat 2.txt
3 K+ A: w8 C( H  L; i-bash: {time: command not found
原来bash把 {time 作为一个整体来处理了,前后都加上空格试试。 * n+ q2 a7 o* d; U% ?3 q
[root@web186 root]# { time find . -name "mysql.sh" } 2>2.txt / g% b) w5 K; j% b
> Ctrl+C
这次Bash认为命令都没有输入完成,少了分号。因为Bash认为后面的 } 是find命令的参数。
4 e9 `( T. Z; r6 w( g5 O. I- q9 I[root@web186 root]# { time find . -name "mysql.sh"; } 2>2.txt
6 w8 I' s/ B$ }' i# }./work186/sms/bin/mysql.sh3 o. i; [8 Z( l8 ]9 h; E5 R
./work186/sms/src/scripts/mysql.sh* _5 \  B! I5 O  t6 a, U
./work186/sms/src/scripts1/mysql.sh5 _% x; w  {7 e' m* m- o/ y+ g  J
./work186/sms1/bin/mysql.sh3 z# p$ t4 r& z: E7 @  I+ O2 G/ Q
./work186/sms1/src/scripts/mysql.sh) g+ T  P4 |4 i6 k7 q1 P
./temp/sms/bin/mysql.sh
) _0 C, Z5 h/ U. O; x$ k0 n./temp/sms/src/scripts/mysql.sh
8 z$ ?, r+ s, T7 Q# B[root@web186 root]# cat 2.txt
; ~) P" c8 ]" F' e+ h
; H5 r$ ?( f6 w: freal    0m0.068s% b! R7 }3 i& v; x% v
user    0m0.030s
+ Q' o: n$ h! ~; J& Dsys     0m0.040s
第一种方式的尝试成功了,总结起来就是 { time command-line; } 2>file  注意分隔符的使用。
另外一种方式就是使用子Shell的方式,如下所示:
[root@web186 root]# (time find . -name "mysql.sh") 2>2.txt
, k% N+ p/ K- _: ?5 {./work186/sms/bin/mysql.sh
- h  i5 @, p& R. V5 ?6 V# Z./work186/sms/src/scripts/mysql.sh! j1 W  D. E  k3 t, i, H
./work186/sms/src/scripts1/mysql.sh
# s) U& E* E# H; ~/ s0 Y./work186/sms1/bin/mysql.sh4 ~, [3 ~' p4 X# E1 O2 m5 t
./work186/sms1/src/scripts/mysql.sh
6 d: J  P- b$ H( j! }: m./temp/sms/bin/mysql.sh
. _3 ~4 e! T9 p& g, P+ a./temp/sms/src/scripts/mysql.sh
. H, E. S% L3 g4 O/ {[root@web186 root]# cat 2.txt
1 C' y, J" J; u; Q; ]8 F1 x# J: ]. N. G, [8 H6 V" }5 a! |
real    0m0.083s
8 y% k8 \" c1 uuser    0m0.040s
' K2 b8 {6 e$ a3 X* n+ ~2 q/ bsys     0m0.020s& f4 X7 [2 K5 {
[root@web186 root]#
第二种方式的尝试也成功了,总结起来就是 (time command-line) 2>file 这里time紧贴着小括号(也可以的,命令行结束也不必带分号。当然最好还是用第一种方式,毕竟启动一个子shell是要多占些资源的。

+ o2 x, m# h- W9 `0 e, p* e
针对dd命令。同time命令,dd命令包括了time命令。) Y. ~) k- j8 A  d1 k; K& @
7 v8 c3 t' B3 [. ?' O# c( U! k) o" N
故 dd if=/dev/zero of=/mnt/test bs=1k count=100 >>output.txt% j4 p' R. ?- e6 j) `- x
& g9 I: b# A. s% m6 x4 m
此时并不能把dd命令显示的时间和速度保存到output.txt里。因为dd命令的输出是到标准错误输出上的。9 ]4 I4 h$ T3 v$ J( q8 g

2 W+ d- ~7 S, A9 o9 S( q必须采用dd if=/dev/zero of=/mnt/test bs=1k count=100  2>>output.txt 才可以。
  |" r5 M$ b% ?9 p

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-25 13:47 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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