4

ターミナルでコマンドを実行すると、出力が大きすぎて、最後に「| less」を付けるのを忘れてしまうことがあります。zshで出力が大きすぎる場合、出力をページングすることは可能でしょうか?

私はpythonとlessを使ってこの機能を実装しようとしました:

#!/usr/bin/env python3
termHeight = 25
import sys
from subprocess import Popen, PIPE
p = Popen(['unbuffer'] + sys.argv[1:], stdin=PIPE, stdout=PIPE)
lines = []
for count in range(termHeight):
    line = p.stdout.readline()
    if not line:
        break
    print(line.decode('utf8'), end='')
    lines += [line]
if line:
    q = Popen(['less', '-Mr'], stdin=PIPE)
    q.stdin.writelines(lines)
    while True:
        line = p.stdout.readline()
        if not line:
            break
        q.stdin.write(line)
    q.communicate()

この python スクリプトを p.py に保存しましょう。したがって、「python p.py some commands」(「python p.py ls --help」など) を実行すると、出力が 25 行を超える場合、このスクリプトは出力を表示するために less を使用します。

問題は、ユーザーからの入力を取得できないことです。つまり、このソリューションは対話型プログラムではまったく機能しません。

4

4 に答える 4

4

これが可能かどうかはわかりません。zsh次の 2 つのことを行う必要があります。

  1. コマンドが標準出力に書き込んでいるかどうかを判別する
  2. その出力を傍受し、必要に応じてページャーに表示します。

2 つ目はかなり単純です。実際に行うことは、すべてのコマンドの出力を に渡し、lessオプションのペアを使用して、less必要な画面が 1 つだけの場合に自動的に終了することです。

preexec () {
    eval "$3" | less -XF
}

ただし、最初の基準はよりトリッキーです。次のようなコマンドは必要ありません。

  • vi foo.txt
  • less bar.rtf
  • ssh remote.host.com

を介してパイプされlessます。残念ながら、パイプを介して実行するプログラムと実行したくないプログラムを自動的に区別する方法は、私には明らかではありませんless

于 2013-03-18T23:19:34.847 に答える
0

おそらく別のオプションは、あなたのためにページングを強制しようとするのではなく、のようscreenなものを使用することです。このソリューションは、接続、ページャーなどのエディターをサポートし、各コマンドをページャーにパイプすることではできないマルチコマンドのスクロールバック機能も提供します。tmuxzshvimsshlessmore

このアプローチはあなたに与えるでしょう:

  • (最後に入力したコマンドだけでなく)複数のコマンドをスクロールバック(かなり多くのスクロールバック)します。
  • セッションへの再アタッチメント(昼食から戻ったときに朝のセッションからスクロールバックを失うことがないように)。

このアプローチにはコストがかかります。

  • コマンドを実行する前に、接続するセッションを作成する必要があります。これはそれほど大変な作業ではありませんが、私の経験では、使用するのを忘れたscreenのは、本当に本当にやりたかった時間です。
于 2013-03-20T04:12:49.107 に答える
0

確かにできることは、シェル関数で複数のテキスト画面を出力する可能性のあるコマンドをラップすることです。

それは、自動的にページングされた ls のように機能するようなものです

function ls {
   command ls $@ | less -RFX
 }

コマンド名のリストをエントリとして受け取り、各コマンドのラッパー関数を生成するものを作成することもできます。したがって、新しいコマンド名をファイルに追加してラッパーを再生成するだけで済みます。

それが私の回避策です。

于 2015-01-15T23:29:10.193 に答える