Có phiên bản phân trang của `watch` không?


24

Trong hệ vỏ UNIX, làm thế nào tôi có thể có được hiệu ứng tương tự với watchlệnh, nhưng với phân trang để tôi có thể cuộn xung quanh trong đầu ra nếu nó chiếm nhiều hơn một màn hình?

Nói cách khác, tôi muốn một chương trình là watchnhững gì lesssẽ làm cat.

Ví dụ, giả sử tôi muốn xem đầu ra qstat, tôi có thể sử dụng

watch qstat

để xem đầu ra của qstat, nhưng điều này chỉ có thể hiển thị màn hình đầu tiên.

Với phiên bản phân trang watch, tôi sẽ có thể di chuyển xung quanh trong đầu ra vì nó vẫn được cập nhật liên tục watch. Có cách nào để làm điều này vào lúc này với các tiện ích hiện có không?


Điều này có lẽ thuộc về SuperUser hoặc có thể là ServerFault.

Bạn có thể đúng, làm thế nào tôi có thể di chuyển nó?
David Dean

Ba người đã bỏ phiếu để di chuyển nó cho đến nay; nếu có thêm hai người (hoặc người điều hành) bỏ phiếu để di chuyển nó, thì nó sẽ tự động xảy ra.
Greg Hewgill

Tại sao không chỉ mở một cửa sổ lớn hơn và biến mất hoàn toàn với phân trang?
Marcin

1
vì màn hình của tôi đã đầy? Tại sao sử dụng lesskhi bạn chỉ có thể sử dụng catvà một cửa sổ lớn hơn?
David Dean

Câu trả lời:


18

Thay vì sửa đổi lệnh 'xem', hãy sử dụng màn hình!

Ví dụ: giả sử bạn cần có thể nhìn thấy 300 dòng chiều cao và 100 ký tự chiều rộng và di chuyển xung quanh đó. Sau khi bắt đầu màn hình, buộc kích thước như vậy:

C-a :height -w 300
C-a :width -w 100

Bây giờ bắt đầu lệnh đồng hồ của bạn. Sau đó, bạn có thể sử dụng C-a <ESC>để trang xung quanh màn hình.

Thật không may, màn hình không làm mới trong khi ở chế độ sao chép. Nhưng nếu bạn muốn điều chỉnh phần nào của cửa sổ bạn đang xem, cách dễ nhất có thể là chạy lại các lệnh chiều cao / chiều rộng theo mặc định, thiết bị đầu cuối của bạn hiển thị phía dưới bên phải của cửa sổ ảo.


Vấn đề duy nhất sau đó là làm thế nào để liên tục lặp lại lệnh, trong khi làm trống màn hình giữa mỗi lần đi
David Dean

Rất tiếc, tôi có nghĩa là chạy lệnh xem trong màn hình. Đã sửa.
MikeyB

yartls - còn một lý do nữa để yêu màn hình :)
warren

lưu ý đó C-là akactrl-
henry

5

Bạn có thể thử điều này:

trong khi vmstat; ngủ 1 giấc; xong | ít hơn

thay thế vmstat bằng qstat và điều chỉnh giấc ngủ theo nhu cầu của bạn


tất cả điều này là tiếp tục lặp lại lệnh vào less, điều đó có nghĩa là bạn cần tiếp tục cuộn để xem đầu ra mới nhất.
David Dean

Có, nhưng bạn có thể cuộn lại. Bạn không thể có cả hai cùng một lúc. Nhấn shift f, đó là chữ 'F' sẽ hoạt động như đuôi.
Jacet Spacen


2

OK, tôi đã có một chút đi vào một watchlesschức năng. Nó hơi thô và dường như chưa hoàn toàn hoạt động, nhưng ở đây:

#!/bin/bash -u
out=$(mktemp)
(while [ 1 ]; do
    "$@" > $out;
    sleep 2;
done) &
less $out
kill $!

Bạn phải sử dụng Rkhóa theo cách thủ công để có được màn hình để cập nhật.

Nó xuất hiện để làm việc watchless datenhưng không cho watchless qstathoặc watchless pstree, cả hai đều hiển thị trống. Có ý kiến ​​gì không?


Bạn nên sử dụng tệp thứ hai để ghi đầu ra của lần chạy tiếp theo của lệnh và sau đó mvtệp thứ hai này vào tệp được đọc lessdưới dạng mvnguyên tử. Mặt khác lesscó thể nghĩ rằng tệp đã biến mất nếu yêu cầu làm mới cùng lúc với tệp đang được ghi với "$@" > $out. Bạn cũng nên ghi vào tệp đầu ra một lần trước khi bắt đầu vòng lặp.
Aurélien Ooms

0

Tôi không thấy cách này có thể được thực hiện khi nội dung hàng thay đổi và watchsẽ đặt lại về dòng đầu tiên sau mỗi 2 giây ngay cả khi bạn có thể cuộn xuống.

Một số cách giải quyết là:

watch 'qstat | tail -n40' để hiển thị đầu ra của qstat bắt đầu từ dòng thứ 40 từ dưới lên

watch 'qstat | grep jsmith' để grep đầu ra để các dòng bạn quan tâm luôn ở màn hình đầu tiên.

Lưu ý rằng bạn cần đặt các lệnh xung quanh đường ống trong các dấu ngoặc đơn - nếu không, bạn sẽ đặt đường ống đầu ra của watch, chứ không phải đầu ra của qstat.


0

Để tiếp tục câu trả lời của enkrs,

xem 'qstat | đầu -300 | đuôi -15 '

sẽ giúp bạn có các trang tùy ý vào đầu ra của qstat.


0

Đây là một kịch bản khá thô mà dường như hoạt động cho một số lệnh mà tôi đã ném vào nó

#!/bin/bash
# ---- mywatch.sh ----

if [ $# -lt 1 && $# -gt 2 ]; then
    echo "Usage: $0 <command> <delay>" 
    exit 1
fi

CMD=$1
if [ $# -eq 2 ]; then
  DELAY=$2
else
  DELAY=2 # default
fi

while : ; do
  ( (echo -e "Every ${DELAY}s: $CMD\n"; $CMD) | less )&
  PID=$!
  sleep $DELAY
  kill -9 $PID &> /dev/null
  clear
done

Được sử dụng như vậy:

alias mywatch="~/bin/mywatch.sh"

mywatch vmstat
mywatch "ps aux" # commands in options need to be quoted
mywaych pstree 10 # change delays

Khá là mô phạm, quá trình chuyển đổi giữa các lần làm mới không diễn ra suôn sẻ như tôi mong muốn. Đương nhiên, là một tập lệnh đơn giản, nó không hỗ trợ làm nổi bật diff (watch -d). Ngoài ra, việc phân tích cú pháp các đối số đầu vào có thể được thực hiện tốt hơn.



0

Tôi thực hiện một kịch bản python đơn giản để đáp ứng yêu cầu này, được đặt tên là "watchall"

lấy nó bằng cách: pip cài đặt watchall

thay thế đồng hồ với watchall và thưởng thức màn hình cuộn. bây giờ nó chỉ hỗ trợ cờ -n và -d.


-1

bạn co thể thử:

watch command > file

sau đó trong tệp của bạn, bạn sẽ thấy đầu ra chắp thêm (Tôi không có phần cứng hộp linux để kiểm tra điều này)


1
Điều đó sẽ không làm những gì bạn dự định, thực sự, nó sẽ chỉ lấp đầy filevới cùng một đầu ra lặp đi lặp lại. Nó chắc chắn không giải quyết câu hỏi ban đầu.
Greg Hewgill

sau đó tôi không biết :)

1
Thay đổi ">" thành ">>" để làm cho nó nối thêm dữ liệu vào tệp?
Rory
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.