コマンド/プログラムのパイプチェーンでwatchコマンドを使用する方法


51

私は通常、watchLinuxユーティリティを使用して、次のようにn秒ごとにコマンドの出力を繰り返し監視しますwatch df -h /some_volume/

しかしwatch、次のような一連のパイプコマンドでは使用できないようです。

$ watch ls -ltr|tail -n 1

私がそれをすると、watch本当に見ていて、何も出力しない出力ls -ltrが渡されtail -n 1ています。

これを試してみると:

$ watch (ls -ltr|tail -n 1)

私は得る

$ watch: syntax error near unexpected token `ls'

そして、次のいずれかが何らかの理由で失敗します。

$ watch <(ls -ltr|tail -n 1)

$ watch < <(ls -ltr|tail -n 1)

$ watch $(ls -ltr|tail -n 1)

$ watch `ls -ltr|tail -n 1)`

そして最後にこれを行うと:

$ watch echo $(ls -ltr|tail -n 1)

内部のコマンド$()が一度だけ実行され、結果の出力文字列が常にリテラルとして印刷(「監視」)されるため、指定された間隔で出力に変化は見られません。

それでは、watchコマンドのパイプチェーン(コマンドをスクリプト内に置くこと以外)でコマンドを機能させるにはどうすればよいですか?


実行man watchして例までスクロールします
...-don_crissti

回答:


82
watch 'command | othertool | yet-another-tool'

1
一般的なアプローチに注目するだけでなく、watch sh -c 'command | etc'特に質問で試されたアプローチに注目する価値があります。
sourcejedi

@sourcejedi理由は実際にはわかりませんが、これが常に同じ結果をもたらすとは限りません。
マイケルミオール


2

サブディレクトリ内のすべてのファイルも一覧表示する場合は、findオプションとexecオプションを使用できます。

watch30秒ごとに更新されfind、現在のディレクトリ(サブディレクトリを含む)のすべての* .logファイルを検索し、ファイル名と最後の10行を出力します。

watch -n30 'find . -name "*.log" -print -exec tail -n10 {} \; '
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.