2

less標準入力からのマルチスクリーン出力の最後の画面で開くためのワンライナーを作成しようとしています。この理由は、私は long を生成するプログラムに取り組んでおり、ASTそれを上下にトラバースできる必要があるためですが、一番下から始めたいと思っています。私はこれを思いつきました:

$ python a.py 2>&1 | tee >(lines=+$(( $(wc -l) - $LINES))) | less +$lines

最初に、出力の行数を計算し、それから減算する必要があるため$LINES、最後の画面の最上行が何であるかがわかります。a.py後で出力を再利用する必要があるteeため、その目的のためにプロセス置換を使用します。最後のステップとしてless、特定の行で元の stdout を開くことを示しています。もちろん、すべてのサブコマンドがサブシェルで実行されるため、最後のステップで設定されていないBashため、機能しません。$linesではZSH、パイプ コマンドはサブシェルで実行されませんが、プロセス置換は実行されるため、どちらも機能しません。宿題や仕事のタスクではなく、一時ファイルを作成せずに自分のやりたいことを実行できるかどうか、BashまたはZSH. 何か案は?

4

2 に答える 2

4

lessこれを本質的にサポートします。使用している構文は、go-to-end を+含め、実行中に入力できるより少ないコマンドを受け入れます。G

... | less +G

あなたが望むことを正確に行います。

これは、man ページの例として実際に明示的に言及されています(「+G」を検索してください)。

于 2016-01-07T23:37:10.213 に答える
1

+Gあなたの質問に対する本当の答えはへのオプションであるべきlessですが、あなたは問題定義があなたが解決したい抽象的な問題を代表していないことを示しました. したがって、次の代替問題を検討してください。

python a.py 2>&1 | \
awk '
  {a[NR]=$0}
  END{
    print NR
    for (i=1;i<=NR;i++)print a[i]
   }
 ' | {
     read -r l
     less -j-1 +$l
 }

このawkコマンドは、行数を出力してから、すべての行を順番に出力しています。メタ情報を含む最初の行を定義します。{これは、とで区切られたコマンドのグループにパイプされます}。最初の行は によって消費されread、変数 に格納されます$l。残りの行は によって取得されless、この変数を使用できます。-j-1が使用されているため、一致した行が画面の下部にあります。

于 2016-01-08T00:08:48.613 に答える