コマンドを一定の時間ごとに実行して結果を端末にスクロールさせずに固定で表示してくれるコマンド。
例
## `ls -al` を1秒ごとに実行$ watch -n 1 ls -al
-n1
のようにつなげてもよい。-n0.1
で0.1秒ごとに実行になる。0.1秒よりも細かい精度では指定できない気がする。
-c
-d
-e
-g
watch
を終了する-n
<秒数>n
と数字の間はスペースがなくてもよい。-t
watch
の情報として実行間隔や実行しているコマンドを表示しているが、このオプションを付けると、非表示になる。-c
,-e
,-g
は環境によって使える場合と使えない場合があるようで、手元の Ubuntu 14.04 では使えたが CentOS 6.3 では使えなかった。
このコマンドを提供しているプロジェクトがもともとは procps というところで、それをforkしたものが procps-ng。CentOS 6では本家 procps を使っていて、Ubuntu や CentOS 7 では procps-ng を使っている。
たぶん、-e
や-g
は procps-ng になってからのオプション。
バッチ処理かなにかで.txt
という拡張子を持つファイルが作られたり消されたりするとして、その様子をリアルタイムに監視するためにls -al *.txt
というコマンドを常時表示させたいとする。そのとき、
$ watch -n1 ls -al *.txt
と書いてしまうと、watchコマンドを開始する前に*.txt
の展開をして、watchコマンドからは毎秒同じ展開結果でlsコマンドを実行してしまい、意図した結果にならない。
以下のようにコマンド全体をクオーテーションなどで囲むとよい。
$ watch -n1 "ls -al *.txt"
実行したいコマンドにパイプが含まれている場合、そのままwatch
の後ろに書くとwatch
コマンド自体の出力をパイプしてしまうので、以下のように実行コマンド全体をダブルクオーテーションなどで囲む。
## ファイルの数を3秒ごとに監視$ watch -n 3 "ls | wc -l"
実行するコマンドがカラーで表示しようとする場合でも、watchコマンドはデフォルトではカラー表示してくれない。
$ watch -n1 ls -al --color
これを実行するとエスケープシーケンスがあらわに表示されて残念な感じになる。
こういうときUbuntuやCentOS 7では-c
オプションが使える。
$ watch -n1 -c ls -al --color