나는 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