내가 관리 팀의 구성원으로 속한 클러스터에서는 sudo find /
문제(예: 끊어진 링크)를 찾거나 디렉터리 트리를 검사하는 등 다양한 명령에 대해 여러 페이지의 표준 출력을 확인해야 하는 경우가 많습니다. 때로는 특이한 이름이 있는지 확인하기 위해 프로젝트 목록이 포함된 긴 텍스트 파일을 살펴봐야 할 때도 있습니다.
일반적으로 출력을 파이핑하면 less
페이지별로 스크롤할 수 있지만 영화 끝 부분의 엔딩 크레딧처럼 표준 출력이 조금 더 느리게 스크롤되면 충분할 것이라고 생각합니다.
Bash나 다른 터미널 환경에서 이를 수행할 수 있는 방법이 있습니까?
답변1
PV파이프라인 뷰어인 를 사용하면 초당 한 줄을 인쇄할 수 있습니다. 다음과 같이 사용하세요.
cat foo | pv --quiet --line-mode --rate-limit 1
(또는 더 짧게 pv -qlL1
). 에서 ( ) 플래그는 초당 인쇄되는 라인 수를 정의합니다. 숫자가 높을수록 출력 속도가 빨라집니다 --line-mode
.--rate-limit
-L
배포판 저장소에서 사용할 수 있어야 합니다(예: aptitude install pv
get 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)
}
}