

ローカルのターミナル上で作業をしていると、たまにぼーっとなってしまうことがあります。そういうときに、時間毎に、定期的にターミナル上にメッセージを表示させて注意を促したいのですが、そういう場合に、最も安全な方法はあるのでしょうか。

例えば、単純にメッセージを定期的に表示させたい、とするならば、下のような無限ループのシェルスクリプトを書き、それをバックグラウンド(`Ctrl+z
bg`)で実行すれば、とりあえずはメッセージが出ます:

[code]

     while true
     do
         echo "\n"
         echo `date`
         sleep 10s
     done
    
[/code]

しかし、この問題は、例えば入力最中のコマンドがあった場合、メッセージが割り込んで表示されてしまい、作業の邪魔になり、またこれを終了させるためには`kill`コマンドを利用しなければならず、どう考えても良い方法だとは思えません。もし、いい方法があれば教えてください。

なお、`notify-send`でバルーン表示ができることはわかっているのですが、そのような方法は期待していません(あくまでターミナル上が望ましいです)。

利用しているシェルは`bash`、利用しているOSは`Ubuntu 14.04`になります。


CC BY-SA 3.0
2015-01-21T05:45:46.393
4966
2015-01-21T07:06:23.163
2015-01-21T05:54:53.697
939
939
question
linux bash
ターミナル上で一定時間ごとになんらかのメッセージを表示するための方法


一つの端末で定期的な表示(カーソル移動や文字列の出力)をほかのプロセスや入力のエコーバックの邪魔せずに実行するには、screen や tmux
など端末マルチプレクサーを利用しないと完全な対応は無理です。

screen であれば、ステータスラインに時刻を表示するのは簡単です。例えば、`~/.screenrc` に次のような設定を記述し `screen`
を起動すれば、ステータスラインに日時が表示されるようになります。

[code]

    hardstatus alwayslastline '%m/%d %02c:%s'
    
[/code]

ステータスラインでなくとも、画面分割して、そのうちの一つで任意のコマンドを定期実行させることもできます。新しめの screen
であればレイアウト機能が役に立ちます。`~/.screenrc`
に次のように書けば、一つの画面に定期的にコマンドを実行でき、別の画面で通常の端末操作が行なえます。

[code]

    screen 0
    screen -t date 99 sh -c "while :; do clear; echo -n $(date '+%F %T'); sleep 10; done"
    
    layout new 0:layout0:horizontal
    
    layout select 0
    split
    
    focus down
    resize -v 1
    select 99
    
    focus up
    select 0
    
[/code]


CC BY-SA 3.0
2015-01-21T06:19:32.347
4975
2015-01-21T07:06:23.163
2015-01-21T07:06:23.163
3061
3061
4966
answer


そのまま表示してしまうと、場所がおかしくなるのが問題であれば、エスケープシーケンスで場所の切り替えをしてあげると良いかもしれません。

具体的には

[code]

    echo -n -e "\033[s\033[1;40H\033[07;37m---ALERT---\033[m\033[u"
    
[/code]

となります。

  * -n : 改行を付加しません
  * -e : エスケープ文字を使用します
  * \033[s : 現在のカーソル位置を保存します
  * \033[ **Y** ; **X** H : カーソルの位置を変更します
  * \033[07;37m : 文字を白の反転にします
  * \033[m : 文字の色を戻します。
  * \033[u : 保存していた位置にカーソルを戻します。


CC BY-SA 3.0
2015-01-21T07:03:23.707
4983
2015-01-21T07:03:23.707
6092
4966
answer