Я сделал такие приемы в системе сборки встроенного дистрибутива Linux. В моем случае это немного отличалось. Сценарий сборки ограничил регион прокрутки (через escape-последовательности VT100) так, чтобы журнал показали в вершине N-4 строки терминала. Нижняя часть четыре строки были превращены в статическую область, которая была обновлена с прогрессом сборки: что в настоящее время создает, прогресс процента и такой.
Путь достигает того, что Вы ищете, это:
Escape-последовательности могут быть найдены в многочисленных ссылках.
Следующее - что-то, что я просто разбил. Это работает с ударом на VM Ubuntu, который я имею здесь. Это полагается $(( ... ))
арифметика, и stty
поддержка -g
сохранять tty настройки в сериализированной строке. Я избегал использования \e
в printf
обозначить символ ESC, который сделал бы это менее портативное.
Мы опрашиваем количество строк от терминала потому что LINES
переменная не могла бы быть экспортирована. (Мы могли вместо этого проанализировать rows
параметр от вывода stty -a
; затем мы могли избежать целого танца помещения tty в режиме без предварительной обработки и получения использования ответа эмулятора терминала dd
. С другой стороны, этот метод работает даже если rows
значение от tty драйвера является неправильным.)
Сохраните этот сценарий как, скажите last10
, сделайте это исполняемым файлом и затем попробуйте, например, last10 find /etc
.
#!/bin/bash # save tty settings saved_stty=$(stty -g) restore() { stty $saved_stty # reset scrolling region printf "\033[1;${rows}r" # move to bottom of display printf "\033[999;1H" } trap restore int term exit # move to bottom of display printf "\033[999;1H" printf "\n\n\n\n\n\n\n\n\n\n" # Query the actual cursor position printf "\033[6n" # read tty response tty_response= stty raw isig -echo while true; do char=$(dd bs=1 count=1 2> /dev/null) if [ "$char" = "R" ] ; then break; fi tty_response="$tty_response$char" done stty $saved_stty # parse tty_response get_size() { cols=$3 rows=$2 } save_IFS=$IFS IFS='[;R' get_size $tty_response IFS=$save_IFS # set scrolling region to 10 lines printf "\033[$((rows-9));${rows}r" # move to bottom of display printf "\033[999;1H" # run command "$@"
Необходимо будет провести подсчет, таким образом, Вы будете мочь теперь, когда Вы "пропустили" первые десять строк:
rsync -av /source /destination | (c=0; while read i ; do if [ $c -ge 10 ]; then echo $c "$i"; fi; ((c++)); done)
функционирование части после канала:
(c=0; while read i ; do if [ $c -ge 10 ]; then echo $c "$i"; fi; ((c++)); done)
возможно, более ясно, если отформатировано как:
c=0;
while read i ; do
if [ $c -ge 10 ]; then
echo $c "$i";
fi;
((c++));
done