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


15

svn export내 응용 프로그램의 패키지 스크립트의 일부로 사용 하고 있으며 다른 많은 명령과 마찬가지로이 명령에는 진행률 표시 줄이없는 것처럼 보입니다.

현재 두 가지 선택이 있습니다.

  • 옵션없이 사용하고 수천 줄을 인쇄하는 것을 지켜보십시오.
  • 을 사용 --quiet하고 완료 될 때까지 아무것도 붙 잡지 마십시오.

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

Exporting SVN directory ... 1234 files

이 숫자 1234 가 실시간으로 증가하는 것을 보 시겠습니까? 출력을이 명령을 수행하는 파이프로 상상할 수 있지만 어느 명령입니까?

답변:


16
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을 이스케이프 문자로 해석하려고합니다.


오, 나는 그 모든 추악 =하고`=`차이점들과 단점들로 bashscripting을 배우지 않을 것이다 . :) 왜 ... 파이썬처럼-syntaxed 언어로 교체하지 않을
보리스 Burkov

이봐, 나도 알아! 인쇄하는 새로운 줄마다 캐리지 리턴 기호를 추가 할 수 있으며 화면이 넘치지 않고 단지 이전 줄을 덮어 씁니다.
Boris Burkov

그래서으로 printf끝나는 이유 \r입니다. 당신이 할 경우 어떤 일이 발생 echo -ne "$I\r"하거나 print -n "$I\r". :) printf그러나 마지막에는 줄 바꿈을 인쇄하지 않기 때문에을 사용 했으므로 \r그냥 처음으로 돌아갑니다. 모든 에코 구현이 불행히도 -e또는 -n인수를 지원하는 것은 아닙니다 .
dannysauer

1
이것은 OpenBSD가 / bin / sh에 사용하는 pdksh 버전에서도 작동합니다.
kurtm

1
+1, 절대적으로 정확하지만로 변경해야 read합니다 read -r(그렇지 않으면 줄 끝에 백 슬래시가 계산에 엉망이되기 때문에). 또한 약간의 작업으로 최신 출력 라인을 표시하도록 조정할 수 있으며 일부 명령에 유용 할 수 있습니다.
ruakh

7

이것은 대략적인 아이디어이지만 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 ] [                                                <=>                                                      ]

나는 pv를 몰랐다. 학습을위한 만세!
dannysauer 2013 년

@dannysauer-pv는 학습에 시간을 투자 할 가치가 있으며 파이프를 통과하는 모든 것을 측정하고 표시 할 수 있습니다.
slm

댓글을 읽고 그 내용을 재생 한 후에 설치했습니다. Linux를 사용하는 18 년이 지났지 만 여전히 새로운 것을 발견해야합니다. :)
dannysauer

0

백그라운드에서 작업을 명령으로 실행하고 stdout (및 stderr을 선택적으로)을 로그 파일 command > logfile &로 경로 재 &지정할 수 있습니다 . 여기서 작업을 지정합니다 (stderr도 &>대신 >).

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

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

이 질문을보십시오. 거의 복제품입니다 : https : //.com


1
그러나 그는 계속 증가하는 실시간 디스플레이를 원하지만 이는 화장실이 아닙니다.
kurtm

@kurtm eh, 그가 훨씬 더 원하는 것은 printf/print/echo대니가 제안한 결과로 화면이 넘치지 않도록하는 것 입니다. :) 물론 그는 사용할 수 less있지만, 그는 wc -l logfile참을성이 없을 때마다 말할 수 있다고 생각 합니다. 나는 ncurses화면을 가지고 놀 거나 화면을 지우는 것이 과도 하다고 생각 합니다.
Boris Burkov

그래 그는 홍수를 원하지 않지만 진행 상황을 알고 싶어합니다. 그렇지 않으면 --quiet을 사용할 수 있습니다.
kurtm

@kurtm 참조 업데이트 : 내 echo -e 'r'명령 을 디버깅하는 데 도움이 될 수 있습니까? 그것은 동적으로 변경되도록, 라인의 이전에 인쇄 된 내용을 삭제해야하지만, 그 :( 할을 강요 할 수
보리스 Burkov

또한 후행 줄 바꿈을 억제하는 n 옵션을 에코에 추가하려고합니다.
kurtm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.