2016-09-12 4 views
1

私は無限ループの中で何度もコマンドラインプログラムを実行したいと思います。
プログラムによって異なるデータが出力されることがあります。は、ちらつきなしで別のプログラムを連続して実行するためのLinuxプログラムですか?

新しいデータが出力されるたびに、以前のデータを上書きしたいと思います。

例:
次のプログラムは時刻を出力します。

#include <stdio.h> 
#include <time.h> 

int main(){ 
    time_t rawtime; 
    struct tm * timeinfo; 
    time (&rawtime); 
    timeinfo = localtime (&rawtime); 
    printf ("Current local time and date: %s", asctime (timeinfo)); 
} 

単純なアプローチは、以下のようになります。もちろん

while true; do ./main; clear; done 

、これは画面ごとの実行をクリアし、ちらつきの原因となります。
enter image description here

私は、変化に
を出力をリフレッシュするが、私は
(またはバッシュの言語機能)を標準のLinuxコマンドを使用して解決策を見つけることを期待していたカスタムプログラムにパイプそれを確かにできました。

プログラムの出力は複数行になる可能性があります。したがって、復帰(/ r)および再書き込みはオプションではありません。

+1

あなたが聞いたことはありませんが、元のプログラムを変更することが許されている場合は、行自体をクリアすることができます。これはちらつきを避けることができます。なぜなら、新しい出力が印刷されるたびに(そしてフラッシュするときに制御する)ことができるからです。これは、出力作業の行を "置き換える"コマンドラインプログラムです。 http://stackoverflow.com/questions/1508490/how-can-i-erase-the-current-line-print-on-console-in-ci -am-working-on-a-lin –

+0

@ChrisKitching私はどんなプログラムのドロップイン置換を探しています。例えば、私は 'ls'などでそれを使うことができます。それはパイプを通じて行うことも、プログラムは別のプログラム名を引数として取ることもできます。どんな作品でも。マルチライン出力も可能です! –

+1

'watch --interval = 1 --no-title。/ main'を試してみませんか?まったく同じではありませんが、十分に近いでしょうか? – fvu

答えて

4

利用可能なコマンドがwatchの場合は、それを使用できます。単純にタイプ

watch ls 
+1

あなたは私のコメントを統合したいと思うかもしれません、彼らは出力がOPが見ているかもしれないものに近いと思います。 – fvu

+0

@fvuええ、あなたのコメントはより良い選択です。 'watch'は解決策です。 '--no-title'が好まれます。間隔を省略すると、可能な限り頻繁に更新されるように見えますが、間隔を追加すると後で役立ちます。ありがとう。 –

+0

@TrevorHickeyそれは奇妙です - 私はここでCentOSボックスで 'watch --no-title date 'を使ってテストしました.2秒ごとにリフレッシュが行われたように見えました。多分それはディストリビューション依存ですか? – fvu

1

これはそれを行うべき:

while true; do LINE=$(date) | echo -en "\r$LINE"; done

は、関心のあるプログラムをdateを交換しますが、それはクールなデモを行います。

このようにパイプを使用すると、新しい出力が印刷されるまで消去が行われないようになり、クリアして新しい出力を1ステップで印刷できます。

警告:somethingが複数の行を印刷する場合、これは正しくクリアされません。 一方、watchまたはclearのように、端末の画面全体には触れません。

関連する問題