端末で標準出力の複数ページのスクロール速度をどのように遅らせることができますか?

端末で標準出力の複数ページのスクロール速度をどのように遅らせることができますか?

私が管理チームのメンバーに属しているクラスターでは、sudo find /問題(例えば、リンクが切れた)を見つけたり、ディレクトリツリーを調べたりするなど、さまざまなコマンドに対して複数ページの標準出力を確認する必要があります。時には、珍しい名前があるかどうかを確認するために、プロジェクトのリストを含む長いテキストファイルを調べる必要があります。

通常、出力をパイピングするとlessページごとにスクロールできますが、映画の終わりにあるエンディングクレジットのように、標準出力が少し遅くスクロールすれば十分です。

Bashや他の端末環境でこれを行う方法はありますか?

答え1

PVPipeline Viewerで、毎秒1行を印刷できます。次のように使用してください。

cat foo | pv --quiet --line-mode --rate-limit 1 

(またはより短くpv -qlL1)。の()フラグは、1秒あたりに印刷される行数を定義します。数値が高いほど出力速度が速くなります--line-mode--rate-limit-L

ディストリビューションリポジトリで利用可能である必要があります(例:aptitude install pvget it)。

答え2

thrigの答えからOPのコメントまで。良い結果。インターライン時間を変更するには、睡眠後の小数点を変更してください。

sudo find / | awk '{system("sleep .5");print}'

ctrl + zを使用してジョブを終了してから終了します(bashを使用している場合)。 ctrl+c はその行だけを終了します。

編集する:

以下の意見に基づいていくつかの調査を行った。この提案はawk '{system(sleep.5)||exit;print}'私のシステムでは機能しませんが、次はCtrl + Cを押して終了できるようです。

awk '{if (system("sleep .5 && exit 2") != 2) exit; print}'

スクリプトに入れるかエイリアスを指定すると、リストトンネルから離れることができます。

答え3

以前の答えで約束したように、単純なCプログラムです。なぜできないの?退屈な日。

ゆっくり。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(int argc, char** argv) {
    int delay;
    char* rem;
    if (argc > 1) {
        delay = strtol(argv[1], &rem, 10);
    } else {
        delay = 500;
    }

    char* line;
    size_t bufsize = 0;

    struct timespec ts;
    ts.tv_sec = delay / 1000;
    ts.tv_nsec = (delay % 1000) * 1000000;

    while (getline(&line, &bufsize, stdin) != -1) {
        printf("%s", line);
        nanosleep(&ts, NULL);
    }
    free(line);
}

良いものを使用してくださいgcc slower.c -o slower。パラメータなしで使用する場合、1行あたりのミリ秒数はデフォルトで500です。

使用法:sudo find / | ./slower [MILLISECONDS PER LINE]

編集:コメントの入力により一部のコードが修正されました。明らかに、getlineはダーティmallocやデフォルト値を必要としません。 getlineにゴミ自体を割り当てるようにしてください。

編集2:誤ったwhile (!feof(stdin))使用法を削除し、互換性のためにbufsizeの初期化に再度追加しました。

答え4

適度な出力を提供するシンプルなGoプログラムです。

// moderare will slow down printing.
//
// $ find ~ | moderare
package main

import (
    "bufio"
    "flag"
    "fmt"
    "io"
    "log"
    "os"
    "time"
)

var (
    sleep = flag.Duration("s", 1*time.Second, "sleep after each line")
    br    = bufio.NewReader(os.Stdin)
)

func main() {
    flag.Parse()
    for {
        line, err := br.ReadString('\n')
        if err == io.EOF {
            break
        }
        if err != nil {
            log.Fatal(err)
        }
        time.Sleep(*sleep)
        fmt.Printf(line)
    }
}

関連情報