![stdout/stderr을 로그 파일로 리디렉션할 수 없습니다. [중복]](https://linux55.com/image/6822/stdout%2Fstderr%EC%9D%84%20%EB%A1%9C%EA%B7%B8%20%ED%8C%8C%EC%9D%BC%EB%A1%9C%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4.%20%5B%EC%A4%91%EB%B3%B5%5D.png)
스크립트가 있습니다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