私は通常、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
コマンドをパイプラインのコマンドチェーンで機能させるにはどうすればよいですか(スクリプト内にコマンドを配置する以外)?
watch 'command | othertool | yet-another-tool'
watch -n 1 "ls -lrt | tail -n20; date"
パイプで走ってみましょう。
サブディレクトリ内のすべてのファイルも一覧表示する場合は、execオプションを指定してfindコマンドを使用できます。
watch
は30秒ごとに更新され、find
は現在のディレクトリ(サブディレクトリを含む)内のすべての* .logファイルを検索し、ファイル名と最後の10行を出力します。
watch -n30 'find . -name "*.log" -print -exec tail -n10 {} \; '
'& "の組み合わせの使用例:
watch -n 1 "links -dump 127.0.0.1/server-status | grep -e '\S' -Fe 'www.'"