명령 출력 줄 수를 실시간으로 표시하는 방법은 무엇입니까?

명령 출력 줄 수를 실시간으로 표시하는 방법은 무엇입니까?

나는 svn export이것을 애플리케이션 패키징 스크립트의 일부로 사용하고 있는데 다른 명령과 마찬가지로 이 명령에도 진행률 표시줄이 없는 것 같습니다.

이제 두 가지 옵션이 있습니다.

  • 옵션 없이 사용하고 수천 줄이 인쇄되는 것을 지켜보세요
  • 사용하면 --quiet완료될 때까지 아무 것도 표시되지 않습니다.

최소한 실시간으로 명령 출력 줄 수를 표시하는 방법이 있습니까? 예를 들어:

Exporting SVN directory ... 1234 files

그리고 이 숫자를 보세요1234 실시간 델타? 이를 수행하기 위해 출력을 명령으로 파이프하는 것을 상상할 수 있지만 어떤 명령입니까?

답변1

yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }

또는 괄호로 묶인 부분을 쉘 스크립트에 넣으십시오. 이는 쉘이 실제로 사전 증가 연산자(예: bash, ksh93 또는 zsh)를 지원하는 경우에만 작동합니다. 그렇지 않으면 증분한 다음 인쇄해야 합니다 $I(그림 참조 I=$((I+1));printf...). 또한 printf쉘의 내장 기능이 아닌 경우(현재 bash의 내장 기능) 더 나은 성능을 위해 대신 사용할 수 echo -ne있습니다 print -n. 개행 문자를 억제하고 \r을 이스케이프 문자로 해석하고 싶을 뿐입니다.

답변2

이것은 대략적인 생각이지만 이 pv명령을 사용하면 줄 수를 세어 화면에 표시할 수 있습니다. pv많은 스위치 중에는 -l통과하는 각 라인의 수를 세는 스위치가 있습니다.

여기서는 SVN 출력의 일부 파일을 시뮬레이션하기 위해 while 루프를 사용하고 있습니다.

$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
   3 0:00:05 [0.99/s ] [      <=>             

다음과 같이 출력 줄을 계속 덮어씁니다.

  18 0:00:36 [   0/s ] [                                     <=>                                                                  ]

  24 0:00:47 [0.991/s ] [                                                <=>                                                      ]

답변3

명령을 백그라운드에서 작업으로 실행하고 해당 stdout(및 선택적으로 stderr)을 로그 파일로 리디렉션할 수 있습니다. command > logfile &여기서 &작업을 지정합니다(stderr도 사용되는 경우 &>) >.

그런 다음 wordcount 유틸리티를 사용하여 로그 파일의 줄 수를 계산할 수 있습니다 wc -l.

동적으로 변경되는 줄에서 상태 변경을 표시하려면 다음과 같은 것을 사용할 수 있지만 bash가 이전 줄의 내용을 죽이는 캐리지 리턴을 while true; do echo -en '\r'; wc -l logfile; sleep 1; done그리도록 강제할 수는 없습니다 .\r

이 질문을 보세요. 거의 중복된 내용입니다.https://stackoverflow.com/questions/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash

관련 정보