重定向失敗的解決 & 輸出重定向備用 &實時重定向

1.重定向失敗的解決

time命令 用於 打印出一條命令或一個程序的執行時間
time 命令以秒爲單位將一條命令執行期間所用的時間、系統時間和 time 命令的執行時間打印在標準錯誤中。

用法:time [ -p ] Command [ Argument ... ]
舉例:想知道 列舉home文件夾這一命令 花費的時間:
      time ls /home
      想知道 將文件複製到某一文件夾 花費的時間:
      time cp /home/***/h /home/***/Documents
      想知道 一個腳本運行的時間:
      time ./helloWorld.sh

time命令結果有三行組成:real、user和sys。我們這裏用的都是real值,CPU用時被劃分爲user和sys兩塊。

real值表示從程序開始到程序執行結束時所消耗的時間,包括CPU的用時

user值表示程序本身,以及它所調用的庫中的子例程使用的時間

sys是由程序直接或間接調用的系統調用執行的時間

在單處理器上,real值和整個CPU用時之差,也就是real - ( user + sys )是所有延遲程序執行的因素的總和。在SMP上,這個值近似爲real * number_of_processors - ( user + sys )。這些因素包括:
•調入程序文本和數據的IO操作
•獲取程序實際使用內存的IO操作
•由其它程序消耗的CPU用時
•由操作系統消耗的CPU用時

話說time是一個bash的保留字。別人這樣講,但是我沒有看出來是爲什麼這樣講,經查time命令是time包中的一個文件。我不知道這樣講(保留字)的目的,但是運行測試,這個命令(time)的確有點特殊。

正常運行time命令:
[root@dy dic]# time sleep 5
real    0m5.001s
user    0m0.001s
sys    0m0.000s

我們重定向命令輸出:
[root@dy dic]# time sleep 5 >out.txt
real    0m5.001s
user    0m0.002s
sys    0m0.001s
屏幕仍然輸出,且out.txt文件爲空,重定向失敗。
使用time sleep 5 2>out.txt命令測試仍然無效。大概上面這個情況就是time成爲bash保留字的理由,據說因爲這個命令的一些特殊性,所以要求它要以一種特殊的形式運行。那麼我們該如何解決類似此種的號稱爲保留字的命令輸出不可重定向的問題呢?

那天剛好看到了 一篇博文如此介紹。因爲time作爲保留字的原因導致它按常規方式輸出不可被重定向,我們可以通過讓它運行在子shell(subshell)形態下,這樣我們就可以正常的重定向它的輸出了。
在console下,兩種讓命令運行在子shell的方式是給命令加小括號和加大括號。按這樣最終實現如下:
1 ( time  sleep 5 ;) 2> out.txt
2 { time sleep 5;} 2>out.txt

注:time命令正常的輸出是stderr(所以要在重定向是加2)。

經測試上面兩種方式都有效。


2.輸出錯誤重定向,從而保證調用其他shell命令時,即使發生錯誤也不會輸出到終端。

[test @test test]# ls -al >list.txt
將顯示的結果輸出到 list.txt 檔案中,若該檔案以存在則予以取代!
[test @test test]# ls -al >> list.txt
將顯示的結果累加到 list.txt 檔案中,該檔案爲累加的,舊數據保留!
[test @test test]# ls -al 1> list.txt 2> list.err
將顯示的數據,正確的輸出到 list.txt 錯誤的數據輸出到 list.err
[test @test test]# ls -al 1> list.txt 2>&1
將顯示的數據,不論正確或錯誤均輸出到 list.txt 當中!
[test @test test]# ls -al 1> list.txt 2> /dev/null
將顯示的數據,正確的輸出到 list.txt 錯誤的數據則予以丟棄!
注意!錯誤與正確檔案輸出到同一個檔案中,則必須以上面的方法來寫!
不能寫成其它格式!


3.實時重定向的兩個可能方法

tail -f urfile|grep --line-buffer string >>myfile

tail -f urfile|tee >>myfile

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章