Estou usando svn export
como parte de um script de empacotador para meu aplicativo e parece que esse comando, como muitos outros, não possui nenhum tipo de barra de progresso.
Tenho duas opções no momento:
- usá-lo sem opções e vê-lo imprimindo milhares de linhas
- usando
--quiet
e não vendo nada até que seja concluído.
Existe uma maneira de mostrar pelo menos o número de linhas geradas pelo comando, em tempo real? Como:
Exporting SVN directory ... 1234 files
E veja este número1234
incremento em tempo real? Posso imaginar canalizar a saída para um comando que faria exatamente isso, mas qual?
Responder1
yourcommand | { I=0; while read; do printf "$((++I))\r"; done; echo ""; }
Ou coloque a seção entre colchetes em um script de shell. Observe que isso só funciona se o seu shell realmente suportar o operador de pré-incremento, como bash ou ksh93 ou zsh. Caso contrário, você terá que incrementar $I
e depois imprimi-lo (como em I=$((I+1));printf...
). Além disso, se printf
não for integrado ao seu shell (é integrado ao bash atual), você poderá usar echo -ne
ou print -n
para obter melhor desempenho. Você só deseja suprimir a nova linha e interpretar \r como um caractere de escape.
Responder2
Esta é uma ideia aproximada, mas você pode usar o pv
comando para contar o número de linhas à medida que elas passam e exibi-las na tela. pv
entre seus muitos switches, há um -l
switch que conta cada linha à medida que ela passa.
Exemplo
Aqui estou usando um loop while para simular alguns arquivos da saída do SVN.
$ for i in $(seq 100); do echo "file$i"; sleep 2; done | pv -l -c >/dev/null
3 0:00:05 [0.99/s ] [ <=>
Ele continuará sobrescrevendo a linha de saída assim:
18 0:00:36 [ 0/s ] [ <=> ]
24 0:00:47 [0.991/s ] [ <=> ]
Responder3
Você pode executar seu comando em segundo plano como um trabalho e redirecionar seu stdout (e stderr opcionalmente) para um arquivo de log: command > logfile &
onde &
designa o trabalho (se stderr também, digamos &>
em vez de >
).
Então você pode usar o utilitário wordcount para contar o número de linhas em seu arquivo de log com wc -l
.
Para mostrar a mudança de estado em uma linha que muda dinamicamente, você poderia usar algo como while true; do echo -en '\r'; wc -l logfile; sleep 1; done
, mas não posso forçar o bash a desenhar \r
o retorno de carro para eliminar o conteúdo da linha anterior.
Veja esta pergunta, é quase uma duplicata:https://stackoverflow.com/questions/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash