"시간"의 출력을 파일에 쓰는 데 대괄호가 필요한 이유는 무엇입니까?

"시간"의 출력을 파일에 쓰는 데 대괄호가 필요한 이유는 무엇입니까?

timewrites 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과 같이 해석되지 않습니까?싱글주문하다?

답변1

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및 타이밍 통계는 여전히 쉘의 stderr에 표시됩니다.

다음을 수행해야 합니다.

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

또는:

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

timing-output쉘의 표준 오류를 시간 구성 이전 으로 리디렉션하려면 (다시 말하지만주문하다)가 사용됩니다(여기서는 시간입니다 cmd > output 2> error 3>&-).

당신은 time또한 수서브쉘표준 오류가 리디렉션됩니다.

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

time하지만 여기서는 이 서브셸이 필요하지 않습니다. 이 구성을 호출할 때 stderr를 리디렉션하기만 하면 됩니다.

대부분의 시스템에는 명령도 있습니다 time. 이 키워드를 비활성화하여 호출할 수 있습니다 time. 키워드는 문자 그대로 받아들일 때만 인식되므로 어떤 방식으로든 키워드를 참조하기만 하면 됩니다.

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

그러나 형식이 다를 수 있으며 두 형식의 stderr time이 .cmderror-and-timing-output

또한 time구성과 달리 명령은 time시간 파이프나 복합 명령, 함수 또는 쉘 내장 기능을 사용할 수 없습니다.

내장 명령인 경우 함수 호출이나 내장 명령의 시간을 측정할 수 있지만 리디렉션, 파이프 또는 복합 명령은 측정할 수 없습니다.


1 참고하세요bash(고려될 수 있는) 오류가 있습니다여기에서 time (cmd) 2> file(예를 들어는 아님 time cmd | (cmd2) 2> file) 타이밍 출력을 다음으로 리디렉션합니다.file

답변2

이름이 지정된 명령이 없으며 별도 입니다 time wc.timewc단어껍질에.

이제는 종종두 개의 별도프로그램name time, 하나는 쉘 키워드이고 다른 하나는 외부 명령입니다.. 쉘에서는 time쉘 키워드이며 입력할 때 time wc ...쉘은 time외부 키워드 대신 해당 키워드를 사용합니다.시간 유틸리티.

쉘이 time키워드를 사용할 때는 필요하지 않습니다.십자가()새로운 프로세스에서는 현재 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

답변3

time실행중인 것은 bash 내장되어 있기 때문입니다 . 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

답변4

time은 쉘 내장 함수이기 때문에 다음과 같이 씁니다.껍데기명령의 표준 오류가 아닌 표준 오류입니다.

전체 명령을 stderr를 리디렉션하는 하위 쉘에 강제로 적용하려면 괄호를 사용하십시오.

중괄호를 사용하면 실제로 서브쉘을 시작하지 않고도 비슷한 결과를 얻을 수 있습니다.

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

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

관련 정보