유닉스의 시간 명령 출력을 bash의 변수로 리디렉션 하시겠습니까?


13

시간 명령의 출력을 캡처하고 싶습니다.

X=$(time ls)

또는

$(time ls) | grep real

시간 함수는 콘솔에 뱉습니다. 어떻게해야합니까?

답변:


12

X =`(time ls) 2> & 1 | 진짜 인사하다


당신은 단지 서브 쉘이 필요하지 않습니다 time; 데니스 윌리엄슨의 대답은 그 점에서 더 낫습니다.
musiphil

11

BashFAQ / 032를 참조하십시오 .

$ # captures output of command and time
$ time=$( TIMEFORMAT="%R"; { time ls; } 2>&1 )    # note the curly braces

$ # captures the time only, passes stdout through
$ exec 3>&1 4>&2
$ time=$(TIMEFORMAT="%R"; { time ls 1>&3 2>&4; } 2>&1)
bar baz
$ exec 3>&- 4>&-

시간은 TIMEFORMAT="%R""실시간"인 "0.000"처럼 보일 것 입니다.


이것이 어떻게 작동하는지 조금 설명해 주시겠습니까? 나는 몇 년 동안이화물 컬트 스타일과 같은 발췌 문장을 사용했습니다. 스트림 3과 4는 무엇입니까? 그리고 '-' ?
Sirex

1
@Sirex : 스트림 3과 4는 exec사용 가능한 파일 설명자를 사용하여 내 대답 의 명령으로 생성 된 스트림입니다 . 사용 가능한 파일 디스크립터를 사용할 수 있습니다. 스트림 3과 4는 각각 1 ( stdout)과 2 ( stderr)의 사본입니다 . 이는 출력이 허용 ls정상적으로 통과 stdout하고 stderr출력하는 동안 (3, 4)을 통해 time(보통 진행하는 stderr일본어로 재) stdout(1), 그리고 명령어 치환 변수 캡처. 내 예에서 볼 수 있듯이 파일 이름 barbaz터미널로 출력됩니다. ...
추후 공지가있을 때까지 일시 중지되었습니다.

1
... 완료되면 추가 스트림은 후행을 사용하여 닫힙니다 -.
추후 공지가있을 때까지 일시 중지되었습니다.

4

Time은 STDOUT이 아닌 STDERR에 출력을 씁니다. 설상가상으로, 기본적으로 'time'은 쉘 내장 명령이므로 'time ls 2> & 1'을 시도하면 '2> & 1'은 'ls'에만 적용됩니다.

해결책은 아마도 다음과 같습니다.

/usr/bin/time -f 'real %e' -o OUTPUT_FILE ls > /dev/null 2>&1<br>
REALTIME=$(cat OUTPUT_FILE | cut -f 2 -d ' ')

더 멋진 방법이 있지만 명확하고 간단한 방법입니다.


나는 -o없이 이것을하는 데 관심이 있습니다. 당신이 생각했던 멋진 방법 중 하나를 게시 할 수 있습니까? :)?
David Doria

0

@Dennis Williamson의 대답은 훌륭하지만 명령의 출력을 한 변수에 저장하고 다른 변수의 출력을 저장하는 데 도움이되지 않습니다 time. 실제로 파일 디스크립터를 사용하는 것은 불가능합니다.

프로그램 실행 시간을 기록하려면 종료 시간에서 시작 시간을 빼면됩니다. 다음은 프로그램을 실행하는 데 걸린 시간 (밀리 초)을 보여주는 간단한 예입니다.

START_TIME=$(date +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(date +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"

이것은 time명령 만큼 정확 하지는 않지만 대부분의 bash 스크립트에는 완벽하게 작동합니다.

불행히도 Mac의 date명령은 %N형식을 지원하지 않지만 coreutils( brew install coreutils)를 설치 하고 사용할 수 있습니다 gdate.

START_TIME=$(gdate +%s%3N)
OUTPUT=$(ls -l)
ELAPSED_TIME=$(expr $(gdate +%s%3N) - $START_TIME)
echo "Command finished in $ELAPSED_TIME milliseconds"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.