`time command`에서 명령의 출력을 재 지정하십시오


11

나는 다음을 사용하여 무언가를 시도하고있다 :

/usr/bin/time myCommand

그러나 /usr/bin/timestderr에 쓰기 때문에 myCommand 도 stderr에 쓰기하면 스트림에서 시간의 출력 이상을 얻습니다. 내가하고 싶은 것은 모든 myCommand의 출력을로 리디렉션 /dev/null하지만 여전히 시간 출력을 stderr에 기록하는 것입니다. stderr에 쓰는 myCommand 예제를 사용하면 ls /nofile다음과 같은 결과가 전혀 없다는 것을 알 수 있습니다.

$ /usr/bin/time ls /nofile 2> /dev/null
$

리디렉션이 없으면 ls(stderr로)의 출력과 시간으로 (stderr로) 의 출력을 모두 볼 수 있습니다 .

$ /usr/bin/time ls /nofile
ls: cannot access /nofile: No such file or directory
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps

내가 원하는 것은 단순히 생산하는 것입니다.

$ /usr/bin/time ls /nofile > RedirectThatImAskingFor
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps

어떤 아이디어?


스크립트 파일에서 time 명령을 사용하고 있습니다. stderr 대신 stdout에서 시간 출력을 원합니다. 이걸 어떻게 얻을 수 있습니까?

답변:


20

ksh에서 bash 및 zsh time는 내장 키워드가 아닌 키워드입니다. 같은 줄의 리디렉션은 time자체 출력이 아닌 시간이 지정된 명령에만 적용됩니다 .

$ time ls -d / /nofile >/dev/null 2>/dev/null

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

time이러한 셸에서 출력 자체 를 리디렉션하려면 추가 수준의 그룹화를 사용해야합니다.

{ time mycommand 2>&3; } 3>&2 2>mycommand.time

독립형 time유틸리티 의 GNU 버전을 사용하는 경우 stderr 이외 -o의 출력을 작성 하는 옵션이 time있습니다. time터미널에 쓸 수 있습니다 :

/usr/bin/time -o /dev/tty mycommand >/dev/null 2>/dev/null

time표준 오류로 출력을 유지하려면 추가 레벨의 파일 디스크립터 셔플 링이 필요합니다.

/usr/bin/time -o /dev/fd/3 mycommand 3>&2 >/dev/null 2>/dev/null

어떤으로 time유틸리티, 당신은 원하는 리디렉션을 수행하는 중간 쉘을 호출 할 수 있습니다. cd, 재 지정 등과 같은 추가 작업을 수행하기 위해 중간 셸을 호출하는 것은 매우 일반적입니다. 셸이 설계 한 작은 일입니다.

/usr/bin/time sh -c 'exec mycommand >/dev/null 2>/dev/null'

몇 가지 후속 조치 : 1) 마지막 제안에서 '실행'은 무엇을합니까? 그것없이 작동하는 것 같습니다 : / usr / bin / time sh -c 'exec ls / nofile &> ./ output.dat'2) "중간 쉘"은 "서브 쉘"과 동일합니다 ( 괄호를 사용하여 생각하십니까?). 나는 / usr / bin / time (ls / nofile &> ./ output.dat)과 같은 것을 아무 소용이 없었습니다. 3) / dev / tty 란 무엇입니까? tty0이 stdin, tty1 = stdout, tty2 = stderr이라는 것을 알고 있지만 'tty'는 어떻습니까?
David Doria

4) / dev / fd3 옵션을 사용하면 -o 출력을 3으로 쓴 다음 3을 2로, 1을 null로, 2를 null로 리디렉션한다고 말하는 것 같습니다. 리디렉션이 왼쪽에서 오른쪽으로 발생하기 때문에 3을 null로 보내면 안됩니까?
David Doria

1
@DavidDoria exec는 해당 프로그램을 서브 프로세스로 실행하는 대신 지정된 프로그램으로 쉘을 대체합니다. 일부 쉘은 명령이 스크립트에서 마지막 명령 일 때이 최적화를 자동으로 수행합니다. "중간 쉘"수단 단지 : 사이의 쉘 timemycommand; 서브 쉘과 관련이 없습니다. /dev/tty명령이 실행되는 터미널입니다 ( /dev/ttyNUM물리적 콘솔 과는 관련이 없으며 파일 설명자와 혼동됩니다 : stdin is /dev/fd/0등).
Gilles 'SO- 악마 그만해'

@DavidDoria 파일 디스크립터가 연결되는 대상 을 왼쪽에서 오른쪽으로 변경 하면 반대 효과가 있습니다. 참조 unix.stackexchange.com/questions/23964/... 또는 unix.stackexchange.com/questions/37660/order-of-redirections
질 'SO-정지 존재 악마'

0
[artur@asus-ux21e ~]$ find /etc/pki/CA/private/
/etc/pki/CA/private/
find: ‘/etc/pki/CA/private/’: Permission denied
[artur@asus-ux21e ~]$ time (find /etc/pki/CA/private/ &> /dev/null)

real    0m0.006s
user    0m0.001s
sys 0m0.004s

그것은 같은 '시간'이 아닙니다 (내가 믿는 bash 별칭입니다). 합리적인 리디렉션 규칙을 따르지 않습니까? $ 시간 &> / dev / null 실제 0m0.000s 사용자 0m0.000s sys 0m0.000s
David Doria

1
어떻습니까 : / usr / bin / time -o time / usr / bin / find / etc / pki / CA / private / &> / dev / null; 고양이 시간
Artur Szymczak

그러나 나는 그것을 보았지만 -o와 같은 내부 메커니즘을 사용하지 않고 어떻게 해야하는지 궁금했습니다.
David Doria

@DavidDoria time배시 별칭 인 인상을주는 것은 무엇입니까 ? CentOS 5.7에 which time표시됩니다 /usr/bin/time.
Timothy Martin

type time을 보여줍니다 :time is a shell keyword
아르투르 Szymczak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.