定期的にプログラムを実行して変化が起こるかどうかを観察したいと思います。ウォッチは正しいコマンドのように聞こえますが、迷惑な空白行を印刷するため、履歴を見ることはできません。ここでスイッチは-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秒あたりの行の割合で、整数のみ可能です。したがって、毎秒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}
コマンドの出力形式を指定するオプションを追加すること(複数の場合はうまく区切るなど)は、読者に練習の問題として残されます。 ;-)