shell(bash)下“time” 命令的輸出詳解
前言
相信大家都知道bash下time是一個(gè)很有用的命令,它可以為一段腳本或一個(gè)程序的執(zhí)行計(jì)時(shí),這通常在粗略比較程序執(zhí)行效率的時(shí)候很方便。但是你會(huì)發(fā)現(xiàn),time命令輸出的時(shí)間文字不能被簡(jiǎn)單地重定向,例如重定向至一個(gè)文本文件,只能顯示在屏幕上,這對(duì)于非交互計(jì)時(shí)很不方便。
例如:
$ 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
通過上面的嘗試,發(fā)現(xiàn)無(wú)法將time的輸出信息重定向到文件里面,為什么?因?yàn)閠ime是shell的關(guān)鍵字,shell做了特殊處理,它會(huì)把time命令后面的命令行作為一個(gè)整體來進(jìn)行處理,在重定向時(shí),實(shí)際上是針對(duì)后面的命令來的,time命令本身的輸出并不會(huì)被重定向的。
關(guān)鍵字time設(shè)置了一個(gè)標(biāo)記,知道command(find)
命令執(zhí)行完,timing信息才被打印到stderr中。time關(guān)鍵字要整個(gè)command和管道,還有相關(guān)的重定向都要來得高級(jí)。這就是為什么簡(jiǎn)單的重定向?qū)τ趖ime而言不起作用。 這是Bash語(yǔ)法定義的。command之后的重定向?qū)τ趖ime而言,是command的一部分。
注:time命令的輸出到標(biāo)準(zhǔn)錯(cuò)誤(stderr)中
當(dāng)time命令執(zhí)行時(shí),command運(yùn)行于當(dāng)前shell(也就是time命令所執(zhí)行的shell)的下一級(jí)shell,而time自身的輸出位于當(dāng)前shell的stderr。像上面所示的那樣重定向只會(huì)使得command的stdout被重定向至一個(gè)文本文件,而不會(huì)輸出time自身的輸出內(nèi)容。
第一種解決方法,就是將time命令和將要執(zhí)行的命令行放到一個(gè)shell代碼塊中,也就是一對(duì)大括號(hào)中,要注意空格和分號(hào)的使用。
$ { 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
第一種方式的嘗試成功了,總結(jié)起來就是 { 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]#
第二種方式的嘗試也成功了,總結(jié)起來就是 (time command-line) 2>file
這里time緊貼著小括號(hào)(也可以的,命令行結(jié)束也不必帶分號(hào)。當(dāng)然最好還是用第一種方式,畢竟啟動(dòng)一個(gè)子shell是要多占些資源的。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
shell查找當(dāng)前目錄下大于1M的文件的三種方法分享
查找當(dāng)前目錄下大于1M的文件的三種方法,有需要的朋友可以參考下2013-02-02unix編程創(chuàng)建前綴固定的臨時(shí)文件代碼分享
unix編程創(chuàng)建一個(gè)前綴固定的臨時(shí)文件,實(shí)現(xiàn)功能:創(chuàng)建一個(gè)臨時(shí)文件,并返回其文件描述符2013-12-12Linux Bash 提示符的一些騷操作(自定義 Bash 提示符)
這篇文章主要介紹了Linux Bash 提示符的一些騷操作,一些能讓你自定義 Bash 提示符的黑科技,需要的朋友可以參考下2017-07-07shell實(shí)現(xiàn)SSH自動(dòng)登陸的方法示例
這篇文章主要介紹了shell實(shí)現(xiàn)SSH自動(dòng)登陸的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Linux里awk中split函數(shù)的用法小結(jié)
The awk function split(s,a,sep) splits a string s into an awk array a using the delimiter sep2013-03-03shell編程基礎(chǔ)之認(rèn)識(shí)與學(xué)習(xí)BASH
本文介紹下,shell基礎(chǔ)編程中有關(guān)bash的相關(guān)知識(shí),有需要的朋友參考學(xué)習(xí)下2013-11-11