• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    shell(bash)下“time” 命令的输出详解

    前言

    相信大家都知道bash下time是一个很有用的命令,它可以为一段脚本或一个程序的执行计时,这通常在粗略比较程序执行效率的时候很方便。但是你会发现,time命令输出的时间文字不能被简单地重定向,例如重定向至一个文本文件,只能显示在屏幕上,这对于非交互计时很不方便。

    例如:

    $ time find . -name "mysql.sh" >1.txt
    
    real 0m0.081s
    user 0m0.060s
    sys  0m0.020s
    
    $ 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命令本身的输出并不会被重定向的。

    关键字time设置了一个标记,知道command(find)命令执行完,timing信息才被打印到stderr中。time关键字要整个command和管道,还有相关的重定向都要来得高级。这就是为什么简单的重定向对于time而言不起作用。 这是Bash语法定义的。command之后的重定向对于time而言,是command的一部分。

    注:time命令的输出到标准错误(stderr)中

    当time命令执行时,command运行于当前shell(也就是time命令所执行的shell)的下一级shell,而time自身的输出位于当前shell的stderr。像上面所示的那样重定向只会使得command的stdout被重定向至一个文本文件,而不会输出time自身的输出内容。

    第一种解决方法,就是将time命令和将要执行的命令行放到一个shell代码块中,也就是一对大括号中,要注意空格和分号的使用。

    $ { 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
    $ cat 2.txt
    
    real 0m0.068s
    user 0m0.030s
    sys  0m0.040s

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

    另外一种方式就是使用子Shell的方式

    如下所示:

    $ (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
    $ cat 2.txt
    
    real 0m0.083s
    user 0m0.040s
    sys  0m0.020s
    [root@web186 root]#

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

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

    您可能感兴趣的文章:
    • bash shell命令行选项与修传入参数处理
    • Bash Shell中的select命令简单使用示例
    • 列出所有Bash Shell内置命令的方法示例
    上一篇:Shell交互批量更改主机名的方法
    下一篇:深入理解Shell输出颜色与控制
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    shell(bash)下“time” 命令的输出详解 shell,bash,下,time,命令,的,