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
명령 (내장 여부), 그것은 같은 언어의 예약어입니다하지 않습니다 for
나 while
.
파이프 라인 시간을 정하는 데 사용됩니다 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
그러나 형식이 다른 두의 표준 에러 수 있습니다주의 time
와 cmd
병합됩니다error-and-timing-output
.
또한 time
명령은time
구문 은 파이프 라인 또는 복합 명령 또는 함수 또는 쉘 내장 시간을 지정할 수 없습니다 …
기본 제공 명령 인 경우 함수 호출 또는 기본 제공 시간을 지정할 수 있지만 재 지정 또는 파이프 라인 또는 복합 명령의 시간을 지정할 수는 없습니다.
1 개 주 bash
(무엇으로 간주 될 수있다) 한 버그 있다 time (cmd) 2> file
(그러나 time cmd | (cmd2) 2> file
예를 들면,은)의 출력 타이밍을 리디렉션file
답변
이라는 이름의 명령은 없습니다 time wc
, time
및 wc
분리 된 단어를 껍질.
이제 두 개의 별도 프로그램 이 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
(예, 세미콜론이 필요합니다)