Использовать линейку команд в ударе без ввода-вывода?

Проблема только bash имеет PROMPT_COMMAND. Попробуйте это вместо этого:

PS1='\[$(if (($?)); then tput setaf 1; else tput setaf 2; fi)\]'\
'[\u@\h \w]\['"$(tput sgr0)"'\]'

¹ Протест: Я не протестировал это на ksh, но это избегает PROMPT_COMMAND и работы в bash.

² tput использует Вашу систему terminfo базы данных. Это обычно более портативно и удобно в сопровождении, чем escape-последовательности жесткого кодирования, обеспечил, terminfo установлен правильно.

7
11.11.2014, 20:23
2 ответа

Я не мог видеть способ сделать это использование bar. Однако Вы могли бы интересоваться этими другими командами, которые делают то же самое, которое могло бы комплект Ваши потребности лучше.

Метод № 1 - Фальшивка это

Этот метод просто перезапишет то, что было ранее отображено на экран с большим индикатором выполнения. Простой, но эффективный.

Пример, ex.bash:

#!/bin/bash

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

Метод № 2 - pipeview

Команда pv обеспечивает функциональность индикатора выполнения. Вы видите более тщательно продуманные примеры в этой названной статье: Утилита Unix Необходимо Знать О: Средство просмотра Канала.

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

Метод № 3 - счетчик

Можно использовать следующий код кода для построения собственного "счетчика" с помощью простого цикла. В цикле Вы могли встроить любые команды, которые Вы любите. Этот код прибывает из этой статьи, названной: я могу сделать счетчик в Bash?.

#!/bin/bash

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

Метод № 4 - диалоговое окно

Существует названная команда dialog который делает в значительной степени, что Вы хотите. Это использует графические диалоговые окна, но они - ncurses, базирующийся, таким образом, они будут работать в почти каждом терминале и/или сценарии, пока существует поддержка ncurses. Вы видите весь dialog документация относительно веб-сайта проекта.

снимок экрана

ss of guage

Ссылки

9
27.01.2020, 20:17

кажется тривиальным для реализации. Функция Bash ниже (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="\033["
  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
}

Использование

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

Регулярный пример прогресса:

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

Пример случайного прогресса:

for i in {1..10}; do bar $((i*10)); sleep `echo $RANDOM / 10000|bc`; done;
0
27.01.2020, 20:17

Теги

Похожие вопросы