왜 time ls | grep real
이것을 출력 합니까?
real 0m0.002s
user 0m0.000s
sys 0m0.002s
그냥 대신에
real 0m0.002s
내가 입력하면
echo -e 'real\t0m0.002s\nuser\t0m0.000s\nsys\t0m0.002s\n' | grep real
나는 내가 기대하는 것을 얻습니다. 즉,
real 0m0.002s
나는 이것이 효과가 있다는 것을 알았습니다.
(time ls) 2>&1 > /dev/null | grep real
이 명령은 무엇을 합니까?
답변1
time ls | grep real
예상대로 작동 하지 않는 이유는 무엇입니까 ?
time
은 bash
예약어이며 와 다르게 동작합니다 /usr/bin/time
.
시간 예약어가 파이프라인 앞에 오면 해당 실행에 소비된 사용자 및 시스템 시간과 경과된 시간이 보고됩니다.파이프라인이 종료될 때.
원천bash(1): GNU Bourne-Again SHell - Linux 매뉴얼 페이지
또한 time
표준 출력이 아닌 표준 오류로 출력됩니다.
다음 명령을 사용하십시오.
(time ls) 2>&1 >/dev/null | grep real
노트:
and는
(
및 명령 을 함께)
그룹화합니다 (따라서 이러한 명령이 먼저 평가됩니다).time
ls
2>&1 >/dev/null
먼저 stderr를 stdout(파이프)으로 리디렉션한 다음 stdout을/dev/null
.그래서 stderr은 파이프로 가고 stdout은 아무데도 가지 않습니다.
추가 자료
- Linux용 Bash 명령줄의 AZ 인덱스- Bash 명령줄과 관련된 모든 것에 대한 훌륭한 참고 자료입니다.
- 괄호- 괄호를 사용하여 표현식을 그룹화하고 확장합니다.
- 구문 리디렉션- 리디렉션 및 프로세스 대체.
- Bash 참조 매뉴얼: 리디렉션
- 그림이 포함된 리디렉션 튜토리얼 [Bash Hackers Wiki]
답변2
예, 작동하지만 약간의 I/O 리디렉션이 필요합니다. :)
$ exec 3>&1 4>&2
{ time sleep 1 1>&3 2>&4; } 2>&1 |
grep 'real'
exec 3>&- 4>&-
출력 :
real 0m1,003s
아주 간단한 방법은 다음과 같습니다.
$ TIMEFORMAT=%R
$ time sleep 1
1,003
답변3
여기에는 두 가지 문제가 있습니다.
첫 번째이자 가장 중요한 것은 "시간"이 출력을 stdout이 아닌 stderr(표준 오류)로 보내므로 특별한 조치를 취하지 않는 한 일반적인 리디렉션 명령으로 캡처되지 않습니다.
둘째, time은 일반 프로그램이 아니라 쉘(bash, csh, tcsh 등과 같은 쉘의 경우)에서 직접 해석되는 특수 내장 명령입니다. 따라서 이는 비표준 방식으로 작동하며 (매우 특이한 쉘을 사용하지 않는 한) 전체 명령줄의 시간을 측정합니다.
따라서 (bash를 사용하여) 원하는 결과를 얻으려면 다음을 사용해야 합니다.
(time ls) 2>&1 | grep real
이것은 서브쉘에서 "ls"를 실행하고 시간을 측정합니다.(시간 ls)] , 표준 오류를 표준 출력으로 보냅니다.[ 2>&1 ], 그런 다음 표준을 "grep" [|그렙].
">?dev/null"을 사용한 마지막 부분은 "real"이라는 단어가 포함된 경우 ls 명령 자체의 일반 출력을 버립니다.
답변4
time
가 아닌 콘솔에 직접 쓰는 것으로 보입니다 stdout
. 이는 명령이나 파이프라인의 출력이 를 추가해도 영향을 받지 않는다는 것을 의미합니다 time
.
따라서 전체 파이프라인의 시간이 정해지기 때문에 grep
어떤 경우에도 완료 후에 생성되는 시간 보고서를 볼 수 없습니다 .grep