터미널에서 표준 출력의 여러 페이지 스크롤 속도를 어떻게 늦출 수 있나요?

터미널에서 표준 출력의 여러 페이지 스크롤 속도를 어떻게 늦출 수 있나요?

내가 관리 팀의 구성원으로 속한 클러스터에서는 sudo find /문제(예: 끊어진 링크)를 찾거나 디렉터리 트리를 검사하는 등 다양한 명령에 대해 여러 페이지의 표준 출력을 확인해야 하는 경우가 많습니다. 때로는 특이한 이름이 있는지 확인하기 위해 프로젝트 목록이 포함된 긴 텍스트 파일을 살펴봐야 할 때도 있습니다.

일반적으로 출력을 파이핑하면 less페이지별로 스크롤할 수 있지만 영화 끝 부분의 엔딩 크레딧처럼 표준 출력이 조금 더 느리게 스크롤되면 충분할 것이라고 생각합니다.

Bash나 다른 터미널 환경에서 이를 수행할 수 있는 방법이 있습니까?

답변1

PV파이프라인 뷰어인 를 사용하면 초당 한 줄을 인쇄할 수 있습니다. 다음과 같이 사용하세요.

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

(또는 더 짧게 pv -qlL1). 에서 ( ) 플래그는 초당 인쇄되는 라인 수를 정의합니다. 숫자가 높을수록 출력 속도가 빨라집니다 --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 프로그램입니다. 왜 안 돼? 지루한 날.

느리게.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)
    }
}

관련 정보