파일에`time`의 출력을 씁니다. 왜 괄호가 필요한가요?


18

time쓰기는합니다 stderr, 하나는 가정 할 수 있도록하는 추가 2>&1해야 행 출력 명령 줄에 stdout. 그러나 이것은 작동하지 않습니다.

test@debian:~$ cat file 
one two three four
test@debian:~$ time wc file > wc.out 2>&1

real    0m0.022s
user    0m0.000s
sys     0m0.000s
test@debian:~$ cat wc.out 
 1  4 19 file

괄호로만 작동합니다.

test@debian:~$ (time wc file) > wc.out 2>&1
test@debian:~$ cat wc.out 
 1  4 19 file

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

이 경우 괄호가 필요한 이유는 무엇입니까? 단일 명령으로 time wc해석 되지 않는 이유는 무엇 입니까?


3
time쉘 키워드 인지 또는 에 따라 결과가 달라집니다 /usr/bin/time. 여기에는 여러 가지 설명자 집합이있을 수 있습니다 (쉘 및 time프로세스에 연결된 설명자 ). 그리고 ()서브 쉘 이 암시하는 것을 잊지 말자 . ( 강타 전문가를 기다리는 중 : p)
John WH Smith

답변:


24

에서가 ksh, bash그리고 zsh, time명령 (내장 여부), 그것은 같은 언어의 예약어입니다하지 않습니다 forwhile.

파이프 라인 시간을 정하는 데 사용됩니다 1 .

에:

time for i in 1 2; do cmd1 "$i"; done | cmd2 > redir

쉘에 해당 파이프 라인을 실행하도록 지시하는 특수 구문이 있습니다.

for i in 1 2; do cmd1 "$i"; done | cmd2 > redir

타이밍 통계를보고하십시오.

에:

time cmd > output 2> error

그것은 동일한하고있어 , 타이밍cmd > output 2> error 명령을하고, 타이밍 통계는 여전히 쉘의 표준 에러 이동합니다.

당신이 필요합니다 :

{ time cmd > output 2> error; } 2> timing-output

또는:

exec 3>&2 2> timing-output
time cmd > output 2> error 3>&-
exec 2>&3 3>&-

쉘의 stderr timing-output이 time 구문 ( 명령 이 아닌 )을 사용 하기 전에 (여기서는 time cmd > output 2> error 3>&-) 로 리디렉션됩니다 .

stderr가 경로 재 지정된 서브 쉘time 에서 해당 구문을 실행할 수도 있습니다 .

(time cmd > output 2> error) 2> timing-output

그러나 여기서 서브 쉘은 필요하지 않으며, time구문이 호출 될 때 stderr 만 경로 재 지정하면 됩니다.

대부분의 시스템에는 time명령이 있습니다. time키워드 를 사용 중지하여 해당 키워드를 호출 할 수 있습니다 . 키워드로 문자 그대로 인용 할 때만 키워드를 인용하면됩니다.

'time' cmd > output 2> error-and-timing-output

그러나 형식이 다른 두의 표준 에러 수 있습니다주의 timecmd병합됩니다error-and-timing-output .

또한 time명령은time 구문 은 파이프 라인 또는 복합 명령 또는 함수 또는 쉘 내장 시간을 지정할 수 없습니다 ...

기본 제공 명령 인 경우 함수 호출 또는 기본 제공 시간을 지정할 수 있지만 재 지정 또는 파이프 라인 또는 복합 명령의 시간을 지정할 수는 없습니다.


1 개bash(무엇으로 간주 될 수있다) 한 버그 있다 time (cmd) 2> file(그러나 time cmd | (cmd2) 2> file예를 들면,은)의 출력 타이밍을 리디렉션file


글쎄, 나는 종종 그것이 머리 time가 아니라 키워드 라는 것을 기억하기 위해 머리를 강조했다 .
cuonglm

'time'쓰기 /usr/bin/time(또는 심지어 command time:-) 보다 실행 파일을 얻는 데 사용하는 팁에 감사드립니다 .
Alexis

@alexis도 \time.
ctrl-alt-delor

7

이라는 이름의 명령은 없습니다 time wc, timewc분리 된 단어를 껍질.

이제 두 개의 별도 프로그램time있는데, 하나는 shell 키워드이고, 다른 하나는 external command 입니다. 쉘에서 time입력 쉘 키워드입니다, time wc ...쉘은 자사의 키워드를 사용하는 time대신 외부 시간 유틸리티를 .

쉘이 time키워드를 사용하면 새로운 프로세스 를 fork () 할 필요가 없으며 현재 time표준 입력과 표준 오류는 변경되지 않습니다. 리디렉션 부분 :

time wc file > wc.out 2>&1

영향을 미친다 wc .

복합 명령(list) 을 사용할 때 :

(time wc file) > wc.out 2>&1

셸은 time wc file하위 셸 내에서 실행 (time wc file)되었으며 단일 명령 으로 간주되었으며 리디렉션 부분은 표준 출력 및 표준 오류에 영향을 미치며 이제는 time및을 모두 포함합니다 wc.


다른 형식의 그룹화 명령을 사용하여 새 프로세스를 분기하지 않고도 동일한 효과를 얻을 수 있습니다 {list;}.

{time wc file;} > wc.out 2>&1

external을 사용하는 경우 time새 프로세스에서 실행되었으므로이 문제점에 직면하지 않습니다.

/usr/bin/time wc file > wc.out 2>&1

사용 time과 사이에 실질적인 차이가 /usr/bin/time있습니까? 실행 파일이 기능적으로 동일합니까?
Hashim

2

때문에 time당신이 실행하고 bash 내장입니다. 배시는 그것을 특별한 방법으로 처리합니다.

실제 time바이너리 를 사용한다면 , 예상대로 정확하게 동작 할 것입니다 :

/usr/bin/time wc file > wc.out 2>&1

이 시간의 출력은 약간 다릅니다.

 $ /usr/bin/time wc file > wc.out 
0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata1900maxresident)k
0inputs+8outputs (0major+82minor)pagefaults 0swaps

9
내장 된 경우 문제가되지 않습니다. 문제는 언어 의 키워드 라는 것입니다. time cmd > outputcmd > output명령 및 time foo | bar시간 foo | bar.
Stéphane Chazelas

1

그것은 time시간 정보를 쓰는 것이 아닙니다 . 내장 time명령은 명령이 완료된 후 쉘이이를 작성하도록합니다. 그러나 리디렉션은 명령에만 영향을줍니다.

(time ...)경우 리디렉션은 전체 서브 쉘에 적용됩니다.


0

시간이 쉘 내장이기 때문에, 그것은에 기록 명령의 stderr이 아니라 의 stderr에 .

괄호를 사용하면 전체 명령을 stderr를 리디렉션 할 수있는 자식 셸로 만듭니다.

중괄호를 사용하면 실제로 서브 쉘을 시작하지 않고 유사한 결과가 생성됩니다

  { time who ; } > /tmp/timwho >& /tmp/xx 

(예, 세미콜론이 필요합니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.