Use a barra de comando no bash sem E / S?

7

Eu realmente gosto da aparência da saída de bar

Mas esse script é usado apenas para operações de entrada / saída.

Como posso usá-lo como substituto do sono, mas com feedback visual?

sleep 10
    
por rubo77 30.09.2013 / 06:39

2 respostas

9

Eu não consegui ver uma maneira de fazer isso usando bar . No entanto, você pode estar interessado nesses outros comandos que fazem a mesma coisa, que podem atender melhor às suas necessidades.

Método 1 - Fake

Esse método simplesmente sobrescreverá o que foi exibido anteriormente na tela com uma barra de progresso maior. Simples, mas eficaz.

Exemplo, ex.bash :

#!/bin/bash

echo -ne '#####                     (33%)\r'
sleep 1
echo -ne '#############             (66%)\r'
sleep 1
echo -ne '#######################   (100%)\r'
echo -ne '\n'

Método # 2 - pipeview

O comando pv fornece a funcionalidade da barra de progresso. Você pode ver exemplos mais elaborados neste artigo intitulado: Um utilitário Unix que você deve saber sobre: Pipe Viewer .

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

Método # 3 - spinner

Você pode usar o seguinte código de exemplo para construir seu próprio "giratório" usando um loop simples. Dentro do loop, você poderia incorporar qualquer comando que desejar. Este código vem deste artigo, intitulado: Posso fazer um spinner no Bash? .

#!/bin/bash

sp='/-\|'
printf ' '
for i in $(seq 3); do
  printf '\b%.1s' "$sp"
  sp=${sp#?}${sp%???}
  sleep 1
done
echo ''

Método 4 - diálogo

Existe um comando chamado dialog , que faz praticamente o que você deseja. Ele faz uso de diálogos gráficos, mas eles são baseados em ncurses para que funcionem na maioria dos terminais e / ou scripts, desde que haja suporte para ncurses. Você pode ver toda a documentação dialog no site do projeto .

screenshot

Referências

  • Como adicionar uma barra de progresso a um shell roteiro?
por 30.09.2013 / 15:43
0

Parece trivial para implementar. A função bash abaixo (bar) abaixo se comporta como seu script bar (baseado no breve screencast). Ele também é redimensionado dinamicamente com a largura do terminal (na próxima chamada para bar ).

#!/bin/bash

#Helper functions
terminal_width(){
  local width_height='stty size'
  echo ${width_height/* /}
}
string_times_n(){
  local s=$1
  local n=$2
  for((i=0;i<n; i++)); do echo -n "$s"; done
}
##The actual function
bar(){
  local percentage=$1
  local padding=10
  local width=$(echo "scale=0; 0.5 * $(terminal_width)" | bc | cut -d. -f1)
  local equals_n=$(echo "$percentage * $width / 100" | bc | cut -d. -f1)
  local dots_n=$((width - equals_n))

  #ANSI escape sequence magic
  local Esc="3["
  local up="$Esc""K""$Esc""1A""$Esc""K"

  #Clear the line
  string_times_n ' ' "$width"
  echo -ne "\r"

  #Print the current screen
  printf  "%3s%% [" "$percentage"
    string_times_n '=' "$equals_n"
    string_times_n '.' "$dots_n"
  echo -n "]"

  #Go up unless finished
  if [[ "$percentage" == 100 ]] 
  then
    echo
  else
    echo -e "$up"
  fi
}

Uso

. bar.sh #Assuming it's saved in bar.sh
bar $percentage

Exemplo de progresso regular:

for i in {1..10}; do bar $((i*10)); sleep 0.1; done;

Exemplo de progresso aleatório:

for i in {1..10}; do bar $((i*10)); sleep 'echo $RANDOM / 10000|bc'; done;
    
por 19.04.2015 / 16:51