Проблема только 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 установлен правильно.
Я не мог видеть способ сделать это использование bar
. Однако Вы могли бы интересоваться этими другими командами, которые делают то же самое, которое могло бы комплект Ваши потребности лучше.
Этот метод просто перезапишет то, что было ранее отображено на экран с большим индикатором выполнения. Простой, но эффективный.
Пример, ex.bash
:
#!/bin/bash
echo -ne '##### (33%)\r'
sleep 1
echo -ne '############# (66%)\r'
sleep 1
echo -ne '####################### (100%)\r'
echo -ne '\n'
Команда pv
обеспечивает функциональность индикатора выполнения. Вы видите более тщательно продуманные примеры в этой названной статье: Утилита Unix Необходимо Знать О: Средство просмотра Канала.
$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=> ] 15% ETA 0:00:59
Можно использовать следующий код кода для построения собственного "счетчика" с помощью простого цикла. В цикле Вы могли встроить любые команды, которые Вы любите. Этот код прибывает из этой статьи, названной: я могу сделать счетчик в Bash?.
#!/bin/bash
sp='/-\|'
printf ' '
for i in $(seq 3); do
printf '\b%.1s' "$sp"
sp=${sp#?}${sp%???}
sleep 1
done
echo ''
Существует названная команда dialog
который делает в значительной степени, что Вы хотите. Это использует графические диалоговые окна, но они - ncurses, базирующийся, таким образом, они будут работать в почти каждом терминале и/или сценарии, пока существует поддержка ncurses. Вы видите весь dialog
документация относительно веб-сайта проекта.
снимок экрана
кажется тривиальным для реализации. Функция 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;