
この質問はAIX 7に関するものです
私は、数ページのテキストを表示するモニターに取り組んでいます。当初、エンド ユーザーはスクロール リストを希望していたため、次のようなリストを作成しました。
IFS=''; cat plfeed | while read line; do echo $line; perl -e 'select(undef,undef,undef,.8)'; done
エンド ユーザーは、出力ページ (24 行) を一定時間 (たとえば 20 秒) 表示することに決めました。 時間を長くすれば一度に 1 ページ表示できるようになることはわかっていますが、キーボード入力が必要になり、私の使用例では受け入れられません。
要約:
「more」コマンドを自動化するにはどうすればよいでしょうか。あるいは、ページ間でスリープしてから自動的に進む同様の機能を構築するにはどうすればよいですか。
答え1
これはかなり標準的なもので、awk
AIXでも問題ないはずです。
awk '{if(NR>1 && NR%24==1)system("sleep 20");print}'
system()
コメントで述べたように、割り込みで終了したい場合は、
{if(system("sleep 20"))exit}
ただし、お使いの OS では動作しない可能性があります。
答え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.