파이프라인이나 해당 구성 요소에 "시간"을 적용하려면 어떻게 해야 합니까? [복사]

파이프라인이나 해당 구성 요소에 "시간"을 적용하려면 어떻게 해야 합니까? [복사]
time command1 | command2

또는 time에 적용됩니까 ? 귀하의 대답이 둘 중 하나라면 다른 하나는 어떻게 지정하시겠습니까?command1command1 | command2

bash 구문이나 쉘이 명령을 해석하는 방식으로 답변을 설명할 수 있습니까?

쉘이 명령을 구문 분석할 때 time이를 제어 연산자로 인식하기 전에 예약어로 인식합니까? 예약어로 인식되는 것과 제어 연산자로 인식되는 |순서에 따라 또는 에 적용되는지가 결정됩니까 ?time|timecommand1command1 | command2

감사해요.

답변1

time command1 | command2

또는 time에 적용 됩니까 ?command1command1 | command2

time일반적으로 두 가지 방법으로 구현됩니다. 외부 명령과 주어진 셸의 내부 기능입니다. (저는 "함수"라고 부릅니다. "함수"라고 하는 이유는 셸이 구현하는 방식에 따라 다르지만 예약어라고 생각하기 때문입니다. 따라서 time시스템에 외부 장치가 하나 이상 있다고 가정하면,실제 대답은 사용자가 실행 중인 셸과 (해당되는 경우) time해당 셸에서 구현되는 방법에 따라 다릅니다..

태그에 따르면 Bash를 내부 쉘로 사용하고 있으며 단순화를 위해 timeGNU를 외부 쉘로 가정합니다.time

큰 타격 time:

  • 예약어입니다.
  • 전체 파이프라인에 적용됩니다.
  • 내부 명령어/함수/예약어와 함께 사용할 수 있습니다.

그누 time:

  • 외부 명령입니다.
  • 간단한 명령에 작동합니다.
  • 쉘 내에서 호출되지 않는 한 내부 명령/함수/예약어와 함께 사용할 수 없습니다.

특정 시나리오에서 Bash를 실행할 때 time적용하십시오 .command1 | command2. 사용 중인 셸에 내부가 없지만 time시스템에 외부가 있는 경우 .timecommand1


묻다:당신의 대답이 둘 중 하나라면, 다른 하나는 어떻게 지정하시겠습니까?

Bash time내부에서 작동 :command1

  • { … }제한 에 사용되는 범위 time:

    { time command1; } | command2
    
  • 외부 time명령을 실행합니다.

    # Using the `command` builtin
    command time command1 | command2
    
    # Using `env`
    env time command1 | command2
    
    # Escaping/quoting the `time` word
    \time command1 | command2
    'time' command1 | command2
    
    # Explicitly running the external `time` command
    /usr/bin/time command1 | command2
    

GNU 의 경우 :timecommand1 | command2time

  • 파이프를 외부 파일에 배치하고 실행합니다.

    time ./script.sh
    
  • 셸을 호출하고 그 안에서 파이프라인을 실행합니다.

    time sh -c 'command1 | command2'
    

묻다:bash 구문이나 쉘이 명령을 해석하는 방식으로 답변을 설명할 수 있습니까?

Bash는 그것을 기록합니다 time.3.2.2 파이프라인매뉴얼 장:

파이프의 형식은 다음과 같습니다.

[time [-p]] [!] command1 [ | or |& command2 ] …

예약어는 time파이프라인이 완료된 후 타이밍 통계를 인쇄합니다.

GNU 문서는 다음을 time통해 제공됩니다 .info timeman time

명령의 형식은 다음 time과 같습니다.

time [option...] COMMAND [ARG...]

timeCOMMAND주어진 인수를 사용하여 프로그램을 실행합니다 ARG.... COMMAND완료 되면 time사용된 리소스에 대한 정보가 표시됩니다 COMMAND.

POSIX 문서기준time, 이는 많은 구현의 기초가 됩니다 time.

요약

time [-p] utility [argument...]

설명하다

유틸리티는 피연산자로 제공된 인수를 사용하여 피연산자 time로 명명된 유틸리티를 호출 하고 유틸리티의 타이밍 통계를 나열하는 표준 오류에 메시지를 써야 합니다.utilityargument

time파이프라인의 일부로 사용되는 경우 보고된 시간은 그룹화된 명령의 유일한 명령이 아닌 한 지정되지 않습니다(참조:그룹화 명령) 이 파이프라인에서.

근본적인

KornShell에서는 time단순한 명령이 아닌 전체 파이프라인의 시간을 측정하는 데 사용할 수 있는 셸 예약어입니다. POSIX 정의의 표현은 이러한 구현을 허용합니다.

utility대신 이 용어는 command쉘 복합 명령, 파이프, 특수 내장 명령 등을 직접 사용할 수 없다는 사실을 강조하기 위해 사용됩니다. 그러나 utility여기에는 표준 유틸리티뿐만 아니라 사용자 응용 프로그램과 셸 스크립트도 포함됩니다.


묻다:쉘이 명령을 구문 분석할 때 time이를 제어 연산자로 인식하기 전에 예약어로 인식합니까?|

Bash 매뉴얼에서는 이 정보를 명시적으로 언급하지 않지만,POSIX는 명확하게 다음과 같이 말합니다.인식 순서:

2.10.1 쉘 구문 및 어휘 규칙

쉘의 입력 언어는 먼저 문자 수준에서 인식되어야 합니다. 생성된 태그는 다음 규칙(순서대로 적용)에 따라 즉각적인 컨텍스트별로 분류되어야 합니다. 이러한 규칙은 토큰 수준에서 구문 분석할 "토큰"을 결정하는 데 사용해야 합니다. 토큰 인식 규칙토큰 인식적용 가능합니다.

  1. 토큰이 운영자인 경우 해당 운영자의 토큰 식별자가 생성되어야 합니다.
  2. 문자열이 숫자로만 구성되고 구분 기호가 <또는 중 하나 인 경우 >토큰 식별자입니다 .IO_NUMBER반환되어야 합니다.
  3. 그렇지 않으면 토큰 식별자토큰결과.

더 구별하다토큰상황에 따라 다릅니다. 같을 수도 있다토큰생산하다단어,ㅏ이름, 하나ASSIGNMENT_WORD, 또는 상황에 따라 다음 예약어 중 하나를 사용합니다.

간단히 말해서:연산자는 예약어보다 먼저 인식됩니다..


묻다:time예약어로 인식되는 것과 제어 연산자로 인식되는 |순서에 따라 또는 time에 적용되는지 가 결정됩니까 ?command1command1 | command2

예약어로 예약되어 있더라도 time전체 파이프라인이 아닌 간단한 명령에 적용하도록 프로그래밍할 수 있습니다(비록 이 작업을 수행하는 쉘은 모르지만).중요한 것은 time인식되는 순서가 아니라 어떻게 구현되느냐이다..

관련 정보