stdout/stderr을 로그 파일로 리디렉션할 수 없습니다. [중복]

stdout/stderr을 로그 파일로 리디렉션할 수 없습니다. [중복]

스크립트가 있습니다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명령 출력을 로그 파일에 기록하는 올바른 방법은 무엇입니까?

답변1

내장된 time명령 은 bash명령(실제 명령)이 반환된 후 STDERR에 타이밍 정보를 표시합니다. 따라서 이들을 그룹화하고 그룹의 STDERR을 파일에 전달하지 않으면 실제 명령의 STDERR만 파일로 리디렉션되고 time명령이 반환될 때(해당 정보가 표시되기 전에) 파일이 닫힙니다.

명령 그룹화를 사용하여 STDOUT 및 STDERR을 리디렉션할 수 있습니다.

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

또는 서브셸에서 실행합니다.

( 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

관련 정보