내 응용 프로그램에 대한 패키저 스크립트의 일부로 사용하고 있는데 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