Bash 시간 키워드 결과는 두 번째 파이프 명령에서만 작동합니다. 이유를 설명하세요.

Bash 시간 키워드 결과는 두 번째 파이프 명령에서만 작동합니다. 이유를 설명하세요.

완전히 설명할 수 없는 bash time 키워드 명령이 있지만 저에게는 효과적입니다.

내 목표:

  1. bash 스크립트에서 변수 btw를 가져와 값을 캡처하는 Python 스크립트의 실행 시간을 찾으세요.

  2. 성공 또는 실패 분석을 위해 동일한 변수에서 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 )

필드 설명자 튜토리얼:

http://wiki.bash-hackers.org/howto/redirection_tutorial

답변1

in bash은 in kshtime마찬가지로핵심 단어(내장되지 않음) 타이밍관로(간단한 명령뿐만 아니라 복합 명령도 시간을 정할 수 있습니다.)

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

관련 정보