주기적으로 프로그램을 실행하여 변화가 일어나는지 관찰하고 싶습니다. watch가 올바른 명령처럼 들리지만 성가신 빈 줄을 인쇄하므로 기록을 볼 수 없습니다. 여기서 스위치는 -t
실제로 도움이 되지 않습니다.
내가 원하는 것은:
user@machine ~$ #some previous command
user@machine ~$ watch -t date -Is
2020-10-09T12:50:13
2020-10-09T12:50:15
2020-10-09T12:50:17
내가 얻는 것:
2020-10-09T12:50:17
(이전 줄은 모두 사라집니다.)
while 루프와 sleep 명령을 사용할 수 있다는 것을 알고 있지만 입력하는 데 시간이 더 오래 걸리고 다른 단점도 있습니다. 이 루프는 while true; do date -Is ; sleep 2; done
작동하지만 간단한 명령을 선호합니다. 나는 또한 tee 사용에 대한 팁을 다음과 같이 읽었 watch -t ' date -Is | tee -a ./somefile
지만 이것이 쓰기 가능한 파일 시스템에서만 작동하기 때문에 항상 실행 가능한 솔루션은 아닙니다. 임시 파일 시스템인 경우 다시 설치하려고 합니다. 부팅 후에 읽을 수 없습니다. 임베디드 시스템에 문제가 있는 경우 가끔 쓰기 가능한 파일 시스템이 마운트되어 있지 않아 충돌/재시작 후 tempf를 읽을 수 없습니다.
또한 빈 줄을 필터링하기 위해 grep:을 시도했지만 watch -t date -Is | grep -v '^$'
결과가 나오지 않았습니다.
답변1
조금 복잡하지만 다음과 같이 할 수 있습니다.
yes 'date -Is' | pv -qlL1 | sh
(또한 명령을 실행하는 데 걸리는 시간을 더해 2초마다가 아니라 매초마다 명령을 실행한다는 장점도 있습니다.)
1
위는 초당 행 비율이며 정수만 가능합니다. 따라서 초당 1회가 가장 느린 속도입니다. 삭제할 수 있지만 -l
이 경우 요율은 수량으로 표시됩니다.바이트초당. 따라서 각 라인이 9바이트이면 9초마다 명령이 있습니다.
답변2
perl -e '$t=shift; while(1){print $o=$n if ($n=qx(@ARGV)) ne $o; sleep $t}' 1 date -Is
2020-10-07T06:49:07+03:00
2020-10-07T06:49:08+03:00
2020-10-07T06:49:09+03:00
2020-10-07T06:49:10+03:00
부분 지연을 수행하고 명령 및 인수에서 공백과 특수 문자를 올바르게 처리하는 향상된 버전:
#! /usr/bin/perl
use Time::HiRes qw(sleep);
die "usage: $0 delay cmd [args ...]\n" if @ARGV < 2;
sub slurpcmd {
open my $h, '-|', @_ or die "open $_[0]|: $!";
local $/ unless wantarray;
<$h>
}
my $t = shift; my ($o, $n);
while(1){print $o=$n if ($n=slurpcmd @ARGV) ne $o; sleep $t}
명령의 출력 형식을 지정하는 옵션을 추가하는 것(여러 줄인 경우 잘 구분하는 등)은 독자에게 연습 문제로 남겨집니다. ;-)