파일에`time`의 출력을 씁니다. 왜 괄호가 필요한가요? two three four test@debian:~$ time wc file

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해석 되지 않는 이유는 무엇 입니까?



답변

에서가 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 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당신이 실행하고 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

답변

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

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


답변

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

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

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

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

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