태그 보관물: pipe

pipe

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

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

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

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

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

Exporting SVN directory ... 1234 files

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



답변

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


답변

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

답변

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

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

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

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


답변