나는 한때 50,000줄이 넘는 텍스트를 처리하던 *nix 시스템에 Perl 스크립트를 가지고 있습니다. 시간이 좀 걸립니다. 나는 이 모든 텍스트를 처리하는 동안 프로그램이 중단되지 않는다는 것을 사용자에게 알리기 위한 자원 친화적인 방법을 찾으려고 노력하고 있습니다.
현재 텍스트를 처리하는 동안 실시간으로 출력을 인쇄하고 있습니다. 출력 버퍼를 플러시한 다음 한 줄에 출력을 인쇄합니다 \r
. 아무 것도 인쇄하지 않을 때보다 거의 두 배의 시간이 걸리기 때문에 불필요한 리소스 사용처럼 보이지만, 내가 말했듯이 아무것도 인쇄되지 않으면 프로그램이 중단된 것처럼 보입니다.
그래서 내 질문은: 장기 실행 작업을 수행할 때 프로그램이 실제로 실행되고 있음을 사용자에게 알리는 표준 또는 간단한 방법이 있습니까?
답변1
[방금 당신의 대본이진주, 그러나 동일한 논리가 적용됩니다 print "\r"
. STDERR
버퍼링을 사용하거나 꺼야 합니다 $| = 1
. 하단을 참조하세요. ]
CLI "진행 표시기"를 구현하는 한 가지 방법은 \r
(캐리지 리턴) 문자를 사용하는 것입니다. 그러면 커서가 현재 줄의 시작 부분으로 이동됩니다.
#!/bin/bash
count=0
while ((1)); do
echo -ne "\rCount: $count"
sleep 1;
count=$(($count+1));
done
말이 안 된다면 시도해 보세요.
이 기술을 사용하여 지금까지 처리된 행 수 또는 수천 개의 행을 나타낼 수 있습니다. 수십 또는 수백 개의 행은 너무 빈번하지 않기 때문에 괜찮을 수 있지만(더 많은 업데이트 == 느린 런타임) 진행이 계속되고 있음을 보여줄 만큼 여전히 충분히 빈번할 수 있습니다. 단위를 지정하거나 0을 추가할 수 있습니다.
-n
-e
및 의 사용에 유의하십시오 echo
. 이것이 중요합니다.
\b
(백스페이스)를 사용하여 비슷한 효과를 얻을 수도 있습니다 .
펄에서는:
#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);
$| = 1; # Pipeline stdout (i.e., no buffering).
my $count = 1;
while ($count) {
print "\rCount $count";
sleep 1;
$count++;
}
답변2
.
처리하는 동안 개행 문자를 에코하지 않고 인쇄합니다. 고대 기술.
그래서 당신은 다음을 얻습니다:
Processing...............
간단하고 효과적입니다.