
Esta pergunta é para AIX 7
Tenho trabalhado em um monitor que exibirá várias páginas de texto. Inicialmente, o usuário final queria uma lista de rolagem para a qual construí isto:
IFS=''; cat plfeed | while read line; do echo $line; perl -e 'select(undef,undef,undef,.8)'; done
O usuário final decidiu que prefere exibir uma página (24 linhas) de saída por um determinado período de tempo (20 segundos, por exemplo). Eu sei que more me permitirá exibir uma página por vez, mas requer entrada de teclado, o que não é aceitável para meu caso de uso.
tldr;
Como posso automatizar o comando 'mais' ou criar uma função semelhante que durma entre as páginas e avance automaticamente?
Responder1
Este padrão razoável awk
deve funcionar no AIX
awk '{if(NR>1 && NR%24==1)system("sleep 20");print}'
Conforme mencionado nos comentários, se quiser sair na interrupção, você pode substituir system()
por
{if(system("sleep 20"))exit}
mas pode não funcionar no seu sistema operacional.
Responder2
#!/usr/bin/env expect
set timeout 20
spawn -noecho man autoexpect
while 1 {
expect {
timeout { send " " }
-ex "(END)" { exit }
}
}
Responder3
Isso aborda a questão do OP da natureza usando uma awk
solução semelhante ameuh. Fiz as seguintes alterações:
- Saia via Ctrl+ c.
- Use
$LINES
para obter a altura do terminal. - Funciona em Linux e Mac OSX.
- Adicionada documentação e explicações.
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.