使用すると、less file1 file2
Less 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
less
stdout
端末であることを確認し、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)
端末のサイズを確認する前に、isatty
ttyのみのioctlを試してエラーをチェックして動作します。
このような単純なポケットベルmore(1)
(少なくともutil-linuxバージョン)にもこの機能があります。これは、おそらくこの状況で実装できる最も単純な通常の動作であるためです。
何かをパイプするときに注意してください入力する less
(例)、キーボード入力用にgrep foo bar.txt | less
開いている必要があります。/dev/tty
(を使ってこれを行うのがわかりますecho foo | strace less
。