완전히 설명할 수 없는 bash time 키워드 명령이 있지만 저에게는 효과적입니다.
내 목표:
bash 스크립트에서 변수 btw를 가져와 값을 캡처하는 Python 스크립트의 실행 시간을 찾으세요.
성공 또는 실패 분석을 위해 동일한 변수에서 Python 스크립트의 출력을 캡처하는 것도 가능합니다.
주위를 읽은 후 이 명령을 사용하게 되었지만 설명할 수는 없습니다.
ttime=$( (TIMEFORMAT="%U^"; time /../myscript.py ${__myvar} 2>&1 )|& tr -d f)
tr -d f
시간 값이 명령 출력에 추가되도록 파이프라인에서 두 번째 명령이 필요한 이유를 설명해 주시겠습니까?
"tr -df"의 선택은 완전히 임의적이며 내 스크립트의 출력, std 또는 err에 영향을 주지 않습니다. 그러나 이 옵션이나 스크립트의 텍스트 출력에 대해 사소한 방식으로 작동하는 다른 명령이 없으면 다음이 있음을 알 수 있습니다. Python이 돌아올 때 추가 시간이 없습니다. 왜 그렇습니까?
편집하다:
실제 질문은 '왜'여야 합니다 |& tr -d f
. Stephanie가 말했듯이 |&는 time 키워드의 sterr에서 찾은 타이밍을 파이프 출력으로 전달할 수 있도록 허용합니다.
이제 솔루션은 다음과 같습니다.
ttime=$(TIMEFORMAT="%U^"; { time /../myscript.py ${__myvar} ; } 2>&1 )
필드 설명자 튜토리얼:
답변1
in bash
은 in ksh
과 time
마찬가지로핵심 단어(내장되지 않음) 타이밍관로(간단한 명령뿐만 아니라 복합 명령도 시간을 정할 수 있습니다.)
time cmd 2> something
우리는 출력을 stderr로 시간을 맞춰 cmd 2> something
인쇄하지만 원시 stderr로 인쇄합니다.
stderr를 리디렉션해야 합니다.앞으로생성자가 time
호출됩니다. |&
서브셸의 stdout 및 stderr 리디렉션을 사용하여 이 작업을 수행할 수 있지만 time
더 쉬운 방법은 다음과 같습니다.
time=$(TIMEFORMAT="%U^"; { time cmd; } 2>&1)
여기에는 서브쉘이 포함되지 않습니다(여기서는명령 그룹반대로)도 추가 명령이 아닙니다.
참고 bash
:
time=$(time (cmd) 2>&1)
일은 우연히 일어난다. 향후 버전에서 변경될 수 있고 키워드를 사용하는 다른 셸에서는 작동하지 않으므로 이에 의존하지 않을 것입니다 time
.
타이밍 출력만 필요한 경우 $time
(명령의 stdout 또는 stderr이 아닌) 다음을 수행할 수 있습니다.
{ time=$(TIMEFORMAT="%U^"; { time cmd 2>&3 3>&-; } 2>&1); } 3>&1