2010-03-09 33 views
64

我試圖重定向時間命令的輸出,但我不能。如何重定向「時間」命令的輸出?

$time ls > filename 
real 0m0.000s 
user 0m0.000s 
sys  0m0.000s 

在該文件中,我可以看到ls命令的輸出,不就是time。 請解釋,爲什麼我不能以及如何做到這一點。

+1

應該對超級用戶,我想。 – Mnementh 2010-03-09 13:06:05

+1

我不這麼認爲! – abubacker 2010-03-09 13:11:00

+1

這個問題的答案不僅對程序員感興趣,而且對其他高級用戶也很感興趣:http://superuser.com/ – Mnementh 2010-03-09 13:14:05

回答

75

則可以使用重定向時間輸出,

(time ls) &> file 

因爲你需要採取(時間LS)作爲單個命令因此可以使用大括號。

+0

耶很好,但問題是他們是如何做到這一點的? – abubacker 2010-03-09 12:41:19

+1

time命令將把參數作爲命令。但括號會將它歸爲一個命令。 例: 時間LS> FILE1.TXT 在自變量, 0 =時間 1 = 「LS> FILE1.TXT」 – sganesh 2010-03-09 12:49:13

+5

而時間命令打印在stderr輸出。所以你可以使用 (時間ls)2>文件 – sganesh 2010-03-09 12:54:29

8

時間是shell內建的,我不確定是否有方法重定向它。但是,您可以使用 /usr/bin/time,它可以接受任何輸出重定向。

+0

/usr/bin/time --output filename ls – chub 2010-03-09 12:39:50

+3

內置時間與輸出重定向一起工作良好。它只在STDERR上輸出,而不在STDOUT上輸出。 – Mnementh 2010-03-09 13:09:40

+0

問題是內置命令是在shell環境本身內執行的,而不是一個子外殼。由於您的shell的stderr通常連接到終端,重定向不會執行任何操作。爲了重定向內置時間,我相信你必須做一些像'bash time mycmd 2> file'一樣的東西。或者像上面提到的那樣調用'/ usr/bin/time'。 – ktbiz 2017-08-17 02:36:20

16

命令時間將其輸出發送到STDERR(而不是STDOUT)。這是因爲正常執行的命令(在本例中爲ls)會輸出到STDOUT。

如果你想捕捉的時間輸出,然後鍵入:

(time ls) 2> filename 

捕捉只是時間的輸出,但LS的輸出變爲正常的控制檯。如果你想同時捕獲在一個文件中,鍵入:

(time ls) &> filename 

2>重定向STDERR,&>重定向兩者。

+1

這個答案實際上回答了*爲什麼* OP的重定向不起作用,這是OP要求的問題之一。沒有其他人解決這個問題。 – Joshua 2016-06-01 14:27:40

101

無需啓動子shell。使用代碼塊也可以。

{ time ls; } 2> out.txt 

{ time ls > /dev/null 2>&1 ; } 2> out.txt 
+0

+1,最佳答案 – 2010-03-09 13:19:23

+0

同意,最佳答案。給你選擇拋棄ls結果並獲得時間。謝謝ghostdog74 – rd42 2011-09-10 11:43:23

+0

當AIX沒有任何東西可以重定向「hostent」命令的輸出時,它就可以工作。謝謝! – Hugo 2015-05-01 04:04:50

3

如果你不想輸出time和命令混合。 隨着GNU的時候,你可以使用-o file,如:

/usr/bin/time -o tim grep -e k /tmp 1>out 2>err 

tim是時間輸出,outerrgrep輸出和錯誤。

0

重定向似乎不適用於time的原因是它在流水線前使用時是bash保留字(不是內建的!)。的bash(1):

如果時間保留字之前的管線,通過其執行中所消耗的經過以及 用戶和系統時間被報告的 管道終止時。

所以,重定向的time輸出,要麼使用大括號:

{ time ls; } 2> filename 

或致電/usr/bin/time

/usr/bin/time ls 2> filename 
相關問題