topをファイルにリダイレクトすると、ファイルのcatコマンドが複数のtop試行の出力を表示するのはなぜですか?

topをファイルにリダイレクトすると、ファイルのcatコマンドが複数のtop試行の出力を表示するのはなぜですか?

カーネル6.4.0を使用してLinuxシステムをカスタマイズしていますが、奇妙な問題が見つかりました。実行top > a.txt後に実行ウィンドウを開いてみると何度も試した結果であることcat a.txtがわかりますが、他のLinuxシステムではこのような問題は発生しません。他のLinuxシステムでは、このコマンドはコマンドの結果を一度だけ表示します。なぜか分からないの?cat a.txttopcattop

# top > a.txt
# cat a.txt
# ls /usr/bin/top -ltr
lrwxrwxrwx    1 1000     1000            17 Aug 23 02:34 /usr/bin/top -> ../../bin/busybox

次に追加top type:

# type top
top is /usr/bin/top

答え1

一部topの実装(OpenBSDや一部のLinuxシステムでも可能)は、出力が端末に送信されるのか、端末以外(パイプやファイル)に送信されるのかを検出し、それに応じて動作を変更します。出力が端末に到達すると、ユーティリティは対話モードになり、ユーザーの入力を受け入れてディスプレイを定期的に更新します。他の場所に出力する場合はtop非対話型モードで実行され、デフォルトでは1つの結果「画面」のみ出力してから終了します。

Busyboxに含まれる実装はtopこれを実行せず、出力がファイルまたはパイプに移動しても画面の更新を出力し続けます。各更新の前に画面を消去する一連の制御文字があるため、cat最終画面の更新を表示する必要があります(端末が制御文字を解釈しない限り)。一方、エディタでファイルを開くか、less複数のコマンドを使用してその内容を表示する場合は、連続画面を更新します。これは、Linuxシステムで時々発見されるprocps-ngバリアントの場合にも当てはまるようです。top

topBusyboxに単一画面の出力のみをファイルとして出力させるには、次のようにします。

top -n 1 >file

についてはなぜtopこれは本当です。これは、さまざまな方法でツールを実装するさまざまな実装開発者によって異なります。 Busyboxでこのユーティリティを実装するときに行った決定に関する詳細については、topBusyboxに関するフォーラムまたはメーリングリストにお問い合わせください。

関連情報