
Этот вопрос для AIX 7
Я работаю над монитором, который будет отображать несколько страниц текста. Изначально конечный пользователь хотел прокручиваемый список, для которого я построил это:
IFS=''; cat plfeed | while read line; do echo $line; perl -e 'select(undef,undef,undef,.8)'; done
Конечный пользователь решил, что он предпочтет отображать страницу (24 строки) вывода в течение установленного периода времени (например, 20 секунд). Я знаю, что большее значение позволит мне отображать страницу за раз, но для этого требуется ввод с клавиатуры, что неприемлемо для моего варианта использования.
вкратце;
Как автоматизировать команду «еще» или создать аналогичную функцию, которая будет «спать» между страницами, а затем автоматически переходить вперед?
решение1
Это довольно стандартно, awk
должно быть нормально на AIX
awk '{if(NR>1 && NR%24==1)system("sleep 20");print}'
Как упоминалось в комментариях, если вы хотите выйти по прерыванию, вы можете заменить system()
на
{if(system("sleep 20"))exit}
но это может не работать на вашей ОС.
решение2
#!/usr/bin/env expect
set timeout 20
spawn -noecho man autoexpect
while 1 {
expect {
timeout { send " " }
-ex "(END)" { exit }
}
}
решение3
Это отвечает на вопрос автора статьи о природе, используя похожее awk
решениемеухЯ внес следующие изменения:
- Выход через Ctrl+ c.
- Используйте
$LINES
для получения высоты терминала. - Работает на Linux и Mac OSX.
- Добавлена документация и пояснения.
awk -v x=$LINES 'NR % x == 0 && system("sleep 20"){exit} 1'
# ^^^^^^^^^^ ^ ^^^^^^^^ ^ ^
# | | | | |
# | | | | |
# | | | | +
# | | | | f) pattern-action block which
# | | | | prints the current line.
# | | | | - Pattern is Truethy.
# | | | | - Action is empty
# | | | | defaulting to `{print}`
# | | | |
# | | | +
# | | | d) `system` function returns exit code `0` when
# | | | successful and non-zero on 'ctrl-c'.
# | | |
# | | | e) `0` evaluates to false, so `exit` will not
# | | | execute until `ctrl-c` is triggered.
# | | +
# | | c) When line number is evenly divisible
# | | by x (the terminal height)
# | | sleep for 1 second.
# | |
# | |
# | +
# | b) NR current line number.
# |
# +
# a) Set variable `x` to Bash variable $LINES.
# $LINES is set to height of current terminal.