Shell

無法將 stdout/stderr 重定向到日誌文件

  • April 27, 2016

我有一個腳本tmp.sh

#!/bin/bash

echo hello
sleep 3
echo 3

我想將腳本執行時間(以及腳本標準輸出)記錄到日誌文件中。

user$ time ./tmp.sh >& log.tmp

real    0m3.003s
user    0m0.000s
sys     0m0.003s

不起作用。

user$ time ./tmp.sh 2>&1 log.tmp
hello
3

real    0m3.003s
user    0m0.002s
sys     0m0.001s

這也行不通。

time將命令輸出記錄到日誌文件的正確方法是什麼?

在它(實際)返回後的命令後,time內置的bashSTDERR 顯示時間資訊。因此,除非您將它們分組並將組的 STDERR 傳遞給文件,否則只有實際命令的 STDERR 將被重定向到文件,並且在命令返回時文件將被關閉(在time顯示其資訊之前)。

您可以使用命令分組,重定向 STDOUT 和 STDERR:

{ time ./tmp.sh ;} &>log.tmp  

或者在子shell中執行:

( time ./tmp.sh ) &>log.tmp

例子:

$ { time sleep 1 ;} 2>time.log
$ cat time.log 

real    0m1.001s
user    0m0.000s
sys     0m0.000s


$ ( time sleep 1 ) 2>time.log
$ cat time.log 

real    0m1.001s
user    0m0.000s
sys     0m0.000s

引用自:https://unix.stackexchange.com/questions/279343