Cách sử dụng lệnh watch với chuỗi lệnh / chương trình


51

Tôi thường sử dụng watchtiện ích linux để theo dõi đầu ra của lệnh liên tục cứ sau n giây, như trongwatch df -h /some_volume/

Nhưng tôi dường như không thể sử dụng watchvới một loạt các lệnh như:

$ watch ls -ltr|tail -n 1

Nếu tôi làm điều đó, watchthực sự đang xem ls -ltrvà đầu ra đang được chuyển đến tail -n 1mà không đầu ra bất cứ điều gì.

Nếu tôi thử điều này:

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

tôi có

$ watch: syntax error near unexpected token `ls'

Và bất kỳ lý do nào sau đây đều thất bại vì lý do này hay lý do khác:

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

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

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

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

Và cuối cùng nếu làm điều này:

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

Tôi thấy không có thay đổi nào về đầu ra ở khoảng thời gian nhất định vì lệnh bên trong chỉ $()được chạy một lần và chuỗi đầu ra kết quả luôn được in ("đã xem") dưới dạng chữ.

Vì vậy, làm cách nào để làm cho watchlệnh hoạt động với một chuỗi các lệnh [khác với việc đưa chúng vào trong một tập lệnh]?


chạy man watchvà cuộn xuống các ví dụ ...
don_crissti

Câu trả lời:


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

1
Có thể đáng chú ý cách tiếp cận chung chung cũng như watch sh -c 'command | etc'đặc biệt nhìn vào các cách tiếp cận đã thử trong câu hỏi.
nguồn

@sourcejedi Tôi chưa thực sự hiểu tại sao, nhưng điều này sẽ không luôn tạo ra kết quả tương tự.
Michael Mior


2

Nếu bạn cũng muốn liệt kê tất cả các tệp trong thư mục con, bạn có thể sử dụng lệnh find với tùy chọn exec.

watchsẽ cập nhật cứ sau 30 giây và findsẽ tìm kiếm tất cả các tệp * .log trong thư mục hiện tại (bao gồm các thư mục con) và sẽ in tên tệp và 10 dòng cuối cùng của chúng:

watch -n30 'find . -name "*.log" -print -exec tail -n10 {} \; '
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.