shell下time”命令的输出详解
这篇文章主要讲解了“shell下time”命令的输出详解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“shell下time”命令的输出详解”吧!
前言
相信大家都知道bash下time是一个很有用的命令,它可以为一段脚本或一个程序的执行计时,这通常在粗略比较程序执行效率的时候很方便。但是你会发现,time命令输出的时间文字不能被简单地重定向,例如重定向至一个文本文件,只能显示在屏幕上,这对于非交互计时很不方便。
例如:
$ time find . -name "mysql.sh" >1.txtreal 0m0.081suser 0m0.060ssys 0m0.020s$ time find . -name "mysql.sh" 2>2.txt./work186/sms/bin/mysql.sh./work186/sms/class="lazy" data-src/scripts/mysql.sh./work186/sms/class="lazy" data-src/scripts1/mysql.sh./work186/sms1/bin/mysql.sh./work186/sms1/class="lazy" data-src/scripts/mysql.sh./temp/sms/bin/mysql.sh./temp/sms/class="lazy" data-src/scripts/mysql.shreal 0m0.068suser 0m0.040ssys 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/class="lazy" data-src/scripts/mysql.sh./work186/sms/class="lazy" data-src/scripts1/mysql.sh./work186/sms1/bin/mysql.sh./work186/sms1/class="lazy" data-src/scripts/mysql.sh./temp/sms/bin/mysql.sh./temp/sms/class="lazy" data-src/scripts/mysql.sh$ cat 2.txtreal 0m0.068suser 0m0.030ssys 0m0.040s
第一种方式的尝试成功了,总结起来就是 { time command-line; } 2>file
注意分隔符的使用。
另外一种方式就是使用子Shell的方式
如下所示:
$ (time find . -name "mysql.sh") 2>2.txt./work186/sms/bin/mysql.sh./work186/sms/class="lazy" data-src/scripts/mysql.sh./work186/sms/class="lazy" data-src/scripts1/mysql.sh./work186/sms1/bin/mysql.sh./work186/sms1/class="lazy" data-src/scripts/mysql.sh./temp/sms/bin/mysql.sh./temp/sms/class="lazy" data-src/scripts/mysql.sh$ cat 2.txtreal 0m0.083suser 0m0.040ssys 0m0.020s[root@web186 root]#
第二种方式的尝试也成功了,总结起来就是 (time command-line) 2>file
这里time紧贴着小括号(也可以的,命令行结束也不必带分号。当然最好还是用第一种方式,毕竟启动一个子shell是要多占些资源的。
感谢各位的阅读,以上就是“shell下time”命令的输出详解”的内容了,经过本文的学习后,相信大家对shell下time”命令的输出详解这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341