如何减慢终端上多页标准输出的滚动速度?

如何减慢终端上多页标准输出的滚动速度?

在我作为管理团队成员的集群中,我经常必须检查各种命令的多页标准输出,例如sudo find /查找任何问题(例如断开的链接)或检查目录树。有时,我需要查看包含项目列表的长文本文件,以查看是否有任何不寻常的名称。

通常,通过管道输出less,我可以逐页滚动,但我认为如果标准输出滚动得慢一点就足够了,就像电影结尾处的片尾字幕一样。

有没有办法在 bash 或任何其他终端环境中完成此任务?

答案1

光伏发电,管道查看器,将让你每秒打印一行,使用它如下:

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

(或者更短,pv -qlL1)。在 中--line-mode--rate-limit( -L) 标志定义每秒打印的行数;数字越大,输出越快。

它应该可以在您的发行版的存储库中找到(例如aptitude install pv获取它)。

答案2

来自 thrig 对 OP 的评论的回答。效果很好。 sleep后更改小数即可修改行间时间。

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 程序。为什么不?无聊的一天。

较慢.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.如果不带参数使用,每行的毫秒数默认为 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)
    }
}

相关内容