zoukankan      html  css  js  c++  java
  • 解决time命令输出信息的重定向问题

    解决time命令输出信息的重定向问题
    time命令的输出信息是打印在标准错误输出上的, 我们通过一个简单的尝试来验证一下。

    [root@web186 root]# time find . -name "mysql.sh" >1.txt 
    
    real    0m0.081s
    user    0m0.060s
    sys     0m0.020s
    [root@web186 root]# time find . -name "mysql.sh" 2>2.txt 
    ./work186/sms/bin/mysql.sh
    ./work186/sms/src/scripts/mysql.sh
    ./work186/sms/src/scripts1/mysql.sh
    ./work186/sms1/bin/mysql.sh
    ./work186/sms1/src/scripts/mysql.sh
    ./temp/sms/bin/mysql.sh
    ./temp/sms/src/scripts/mysql.sh
    
    real    0m0.068s
    user    0m0.040s
    sys     0m0.030s
    

    通过上面的尝试,发现无法将time的输出信息重定向到文件里面,为什么?因为time是shell的关键字,shell做了特殊处理,它会把time命令后面的命令行作为一个整体来进行处理,在重定向时,实际上是针对后面的命令来的,time命令本身的输出并不会被重定向的。那现在怎么办呢?网上提供了两种解决方法【2,3】,我们一一尝试一下。
    第一种解决方法,就是将time命令和将要执行的命令行放到一个shell代码块中,也就是一对大括号中,要注意空格和分号的使用。

    [root@web186 root]# {time find . -name "mysql.sh"} 2>2.txt
    好像成功了。慢,看一下对不对。 
    [root@web186 root]# cat 2.txt 
    -bash: {time: command not found
    原来bash把 {time 作为一个整体来处理了,前后都加上空格试试。 
    [root@web186 root]# { time find . -name "mysql.sh" } 2>2.txt 
    > Ctrl+C
    这次Bash认为命令都没有输入完成,少了分号。因为Bash认为后面的 } 是find命令的参数。 
    [root@web186 root]# { time find . -name "mysql.sh"; } 2>2.txt 
    ./work186/sms/bin/mysql.sh
    ./work186/sms/src/scripts/mysql.sh
    ./work186/sms/src/scripts1/mysql.sh
    ./work186/sms1/bin/mysql.sh
    ./work186/sms1/src/scripts/mysql.sh
    ./temp/sms/bin/mysql.sh
    ./temp/sms/src/scripts/mysql.sh
    [root@web186 root]# cat 2.txt 
    
    real    0m0.068s
    user    0m0.030s
    sys     0m0.040s
    

    第一种方式的尝试成功了,总结起来就是 { time command-line; } 2>file 注意分隔符的使用。
    另外一种方式就是使用子Shell的方式,如下所示:

    [root@web186 root]# (time find . -name "mysql.sh") 2>2.txt 
    ./work186/sms/bin/mysql.sh
    ./work186/sms/src/scripts/mysql.sh
    ./work186/sms/src/scripts1/mysql.sh
    ./work186/sms1/bin/mysql.sh
    ./work186/sms1/src/scripts/mysql.sh
    ./temp/sms/bin/mysql.sh
    ./temp/sms/src/scripts/mysql.sh
    [root@web186 root]# cat 2.txt 
    
    real    0m0.083s
    user    0m0.040s
    sys     0m0.020s
    [root@web186 root]#
    

    第二种方式的尝试也成功了,总结起来就是 (time command-line) 2>file 这里time紧贴着小括号(也可以的,命令行结束也不必带分号。当然最好还是用第一种方式,毕竟启动一个子shell是要多占些资源的。

  • 相关阅读:
    Memcached Tip 1:使用Memcached Providers
    MVC TIP8:为控制器增加有参构造函数(为了注入等其它用途)
    压力测试的轻量级具体做法
    Memcached Tip 2:Session同步
    ASP.NET性能优化之分布式Session
    ASP.NET性能优化之让浏览器缓存动态网页
    最精简领域驱动设计开发模版(针对WPF)
    MOQ TIP1:简介加基础
    ASP.NET性能优化之减少请求
    MOQ TIP2:匹配参数
  • 原文地址:https://www.cnblogs.com/muahao/p/6831338.html
Copyright © 2011-2022 走看看