less file1 file2 猫 - なぜ動作しますか?

less file1 file2 猫 - なぜ動作しますか?

使用すると、less file1 file2Less Buffer Viewerに表示されている2つのファイルが取得されますが、標準出力に追加された2つのless file1 file2 | catファイルの内容が印刷されます。 「少ないバッファビューア」を表示する必要があるのか​​、次のコマンドのためにstdoutで出力を生成する必要があるのか​​、lessはどうすればわかりますか?これにはどのようなメカニズムが使用されますか?

答え1

lessテキストを標準出力として印刷します。標準出力は次のとおりです。

  • 端末(/dev/tty?)とデフォルトのバッファビューアを開きます。
  • 経由管路less text | cut -d: -f1|()を使用して別のプログラムにパイプする場合
  • 文書less text > tmp>()を使用してリダイレクトする場合

「isa」というC関数があります。端末「出力がtty(4.81未満、main.c、112行)に送信されていることを確認してください。そうであればバッファビューアを使用し、そうでない場合と同じように動作しますcat

Bashではテストを使用できます(参照man test)。

  • -t FD ファイル記述子 FD が端末で開きます。
  • -pファイルが存在し、名前付きパイプです。

例:

[[ -t 1 ]] && \
    echo 'STDOUT is attached to TTY'

[[ -p /dev/stdout ]] && \
    echo 'STDOUT is attached to a pipe'

[[ ! -t 1 && ! -p /dev/stdout ]] && \
    echo 'STDOUT is attached to a redirection'

答え2

lessstdout端末であることを確認し、catそうでない場合はそのまま動作します(EOFまでstdinをstdoutにコピー)。

この機能を使用すると、ファイルに簡単にリダイレクトしながら、出力などの出力を--help常に送信するスクリプトまたはプログラムを作成できます。標準入力でスペースバーを押してテキストなどをめくるのを待ち続けていると、悪lessすぎるでしょう。some_command --fullhelp > help.txt一部のコマンド(例man:)は、独自の出力を確認してポケットベルを介して出力を送信するかどうかを決定します。実行するとman ls > ls.txt絶対に$PAGER

lessパイプラインにさらにステップを追加するときに行で編集するのを忘れた場合は、猫のような動作が便利です。


less端末サイズ(画面サイズ、一度に表示される行数の把握)を把握する必要があります。これioctl(2)on を使用すると、stdoutビターミナルから ENOTTY が返されるため、とにかくビターミナルのケース処理を避けることはできません。 less実際に使用isatty(3)端末のサイズを確認する前に、isattyttyのみのioctlを試してエラーをチェックして動作します。

このような単純なポケットベルmore(1)(少なくともutil-linuxバージョン)にもこの機能があります。これは、おそらくこの状況で実装できる最も単純な通常の動作であるためです。


何かをパイプするときに注意してください入力する less(例)、キーボード入力用にgrep foo bar.txt | less開いている必要があります。/dev/tty(を使ってこれを行うのがわかりますecho foo | strace less

関連情報