此问题针对 AIX 7
我一直在研究一个可以显示几页文本的显示器。最初,最终用户想要一个滚动列表,我为此构建了以下内容:
IFS=''; cat plfeed | while read line; do echo $line; perl -e 'select(undef,undef,undef,.8)'; done
最终用户决定他们宁愿在设定的时间(例如 20 秒)内显示一页(24 行)输出。我知道 more 可以让我一次显示一个页面,但它需要键盘输入,这对于我的用例来说是不可接受的。
太棒了;
如何自动化“更多”命令,或构建一个类似的函数,在页面之间休眠然后自动前进?
答案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
这使用类似的解决方案解决了性质OP的问题嗯。我做了以下更改:
- 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.