2015-07-01 4 views
4

Мне было интересно, как получить динамический вывод в оболочке. Я имею в виду тип вывода, который вы получаете с помощью команды «top» или строки состояния для загрузки wget: выход командной строки изменяется без какой-либо новой строки.Bash Динамический вывод командной строки

Мои особые потребности - получить обратную связь от сценария (который требует многого, чтобы быть выполненным с большим количеством операций) без получения новой строки для каждой обратной связи с операцией, например, скрипта обнаружения, который отправляет пинги в очень большом сети и может динамически сообщать о статусе открытия.

(нет, я не могу использовать птар: D все равно это для исследования цели)

спасибо!

+0

Связанные: http://stackoverflow.com/questions/8547033/how-to- – tripleee

+0

Может быть [это] (http://stackoverflow.com/questions/238073/how-to-add-a-progress-bar -to-shell-script) может служить отправной точкой. –

ответ

2

«Динамический» дисплей - это всего лишь последовательность операторов печати. Некоторые из этих операторов печати печатают управляющие коды экрана, которые перемещают курсор или перекрашивают части экрана. Стандартной базой для де-факто является ncurses. Для доступа из сценария оболочки требуется tput.

Вот простой «анимированный» счетчик.

#!/bin/sh 

# Restore cursor and move to new line when terminated 
trap 'tput cnorm; echo' EXIT 
trap 'exit 127' HUP INT TERM 

# Make text cursor invisible 
tput civis 
# Save cursor position 
tput sc 
while true; do 
    for char in '-' '\' '|' '/'; do 
    # Back to saved position 
    tput rc 
    printf "%s" "$char" 
    sleep 1 
    done 
done 
+0

Yep tput и stty отлично подходят для этого. – 123

1

Вы можете использовать движение курсора с помощью bash. Для перемещения курсора относится к http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html

Если сказать, что вы хотите напечатать даты динамически, вы можете иметь что-то вроде этого:

echo -ne '\033[s'; clear ; for i in `seq 10`;do echo -ne '\033[0;0H' ; date;sleep 1;done ;echo -ne '\033[u'