shell(bash)下“time” 命令的輸出詳解_linux shell

來源:互聯網
上載者:User

前言

相信大家都知道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/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.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/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.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/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.txtreal 0m0.083suser 0m0.040ssys  0m0.020s[root@web186 root]#

第二種方式的嘗試也成功了,總結起來就是 (time command-line) 2>file 這裡time緊貼著小括弧(也可以的,命令列結束也不必帶分號。當然最好還是用第一種方式,畢竟啟動一個子shell是要多佔些資源的。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的協助,如果有疑問大家可以留言交流。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.