web-dev-qa-db-ja.com

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

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

しかし、パイプラインされた一連のコマンドで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)
_

$()内のコマンドは1回だけ実行され、結果の出力文字列は常にリテラルとして出力( "監視")されるため、指定した間隔で出力に変化はありません。

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

60
watch 'command | othertool | yet-another-tool'
107
DopeGhoti
watch -n 1 "ls -lrt | tail -n20; date"

パイプで走ってみましょう。

12
Soft Dot IE

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

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

watch -n30 'find . -name "*.log" -print -exec tail -n10 {} \; '
2
yoyomanYo

'& "の組み合わせの使用例:

watch -n 1 "links -dump 127.0.0.1/server-status | grep -e '\S' -Fe 'www.'"
0
Dimitar Velev