lessを使用してパイプをフォローしますか?


25

(Fを押して)パイプ入力(ファイルと同様)をたどることはできませんか?書き込まれているファイルの場合、コマンド

less <file>

Fを押すと、ファイルを追跡します。

しかし、次のように出力を直接lessにパイプするコマンドがある場合

command | less

Fを押しても何も起こりません。

ファイルができるようにパイプをたどることができないように見えますか?それとも、STDERRへの書き込みコマンドにも関係しているのでしょうか?私が達成しようとしている効果は、常にコマンドの最新の出力を見ることです。Pag​​eDownを押したままにするのと同じです!

関連する発言はG(最後に行く)にも当てはまります:直接lessにパイプすると、機能しません。


回答:


21

FまたはGを押すと、less入力EOFに到達しようとします。入力がパイプの場合、lessパイプが反対側で閉じられるまでハングします(「何もしない」ではありません)。

これを回避するには、コマンド出力をバックグラウンドで一時ファイルに保存し、それを次の入力として使用しますless

command > /tmp/x &
less +F /tmp/x; kill %; rm /tmp/x

これを行うlessだけのオプションはありません。しかし、私はそれが有用であることを認めます。


入力がパイプの場合、lessパイプが反対側で閉じられるまでハングします。それは一種の誤解を招く声明です。何が起こるかというとあまり呼び出していることであるreadブロックモードでは、新しいデータを待っているか、またはパイプの閉鎖。
ピョートルドブロゴスト14

3
パイプ入力でFまたはGを押すとless、読み取りがブロックされるだけでなく、EOFを待機するループで実行されます。また、パイプのEOFは、反対側が閉じている場合にのみ発生します。
mik

3
lessそのループで画面を更新する場合、問題はありません。読み取りのブロックは、この問題とはほとんど関係ありません。
mik

1
@フローこれは質問がかかったハングではなく、この状況で予想される単なる待機です-EOFに到達したときにファイル内のデータを待機する(これは閉じられたパイプでは発生しません)または、フォローモードを終了する割り込みの場合
-mik

1
lessデータがない場合、読み取りをブロックする@PiotrDobrogostは画面を更新できません。一部のデータが表示されると、読み取りをブロックするとそのデータが返され、less別のスレッドなしで画面を更新できるようになります
-mik

6

(Fを押して)パイプ入力(ファイルと同様)をたどることはできませんか?

はい、バージョン474以降。ただし、現在この機能には1つの問題が残っているため、どのバージョンのリリースノートにも記載されていません。以下は、以下のメンテナーからのコメントです–マークヌデルマン:

パイプのFコマンドに関して、これはless-474でも修正されています。EOFをシークする代わりに、Fコマンドはバッファリングされた入力の終わりをシークし、そこで読み取りを開始します。ただし、CTRL-Cを押してFコマンドを停止すると、出力を生成するプロセスが強制終了されるため、実際には使用できません。私はそれを修正する方法がわかりません。

この問題が修正されるまで、シェル機能を使用して回避することができます。私を参照してください答えをているが、パイプで他のプロセスを停止することなく任意の出口までの道「少ない」追従モードを?詳細については質問。

参考のため、パイプで作業していないFの問題は、既知のリストに参照番号300を持っているバグと題されるFコマンドは、パイプで連結された入力の仕事をしません。


関連する発言はG(最後に行く)にも当てはまります:直接lessにパイプすると、機能しません。

バージョン466から動作します。このバージョンのリリースノートから引用:

新しいコマンドESC-Gは、パイプ内の現在バッファーされているデータの最後に移動します


ESC-Gコマンドは、2014
mik

@mikは、バージョン471のリリースノートのエラーのように見えます。修正済み。
ピョートルドブロゴスト

エラーではなく、安定したリリース(この場合はバージョン458)からの変更を段階的にリストします。ただし、ESC-Gコマンドを使用した安定したリリースはありません。
mik

ESC-Gコマンドは現在安定版リリース(481)です:「2015年10月16日less-481が一般使用向けにリリースされました」。
mik

更新:パイプのFコマンドに関して、less-474でも修正されています。EOFをシークする代わりに、Fコマンドはバッファリングされた入力の終わりをシークし、そこで読み取りを開始します。ただし、ctrl-Cを押してFコマンドを停止すると、出力を生成するプロセスが強制終了されるため、実際には使用できません。私はそれを修正する方法がわかりません。
マークヌーデルマン

2

less manページから

[Keyboard] COMMANDS [...]

   F      Scroll  forward, and keep trying to read when the end of file is reached.  Normally this command would be used when already
          at the end of the file.  It is a way to monitor the tail of a file which is growing while it is being viewed.  (The  behav‐
          ior is similar to the "tail -f" command.)

だからこれはうまくいくはずで、実際に私にとってはうまくいきます。


1
@mikで説明されているように、このコマンドはパイプと共に使用すると動作が異なり、明らかにOPが探しているものではありません。
ピョートルドブロゴスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.