Hiển thị đầu ra trên một màn hình khác trên mạng và trở lại bình thường khi hoàn tất


7

Tôi muốn một hành vi tương tự như less vim nanosử dụng vv.

Điều này có thể đạt được với bash?

Câu trả lời:


8

Nếu giả lập hỗ trợ thiết bị đầu cuối của bạn, bạn có thể làm điều này bằng cách sử dụng cơ chế tương tự được sử dụng bởi less, vim, et al, cụ thể là titetermcap khả năng ( smcuprmcuptrong terminfo hiện đại hơn). Các chuyển đổi này từ màn hình chính sang màn hình phụ và trở lại màn hình chính tương ứng.

Nếu hệ thống của bạn có tputlệnh, bạn có thể sử dụng:

tput smcup # switch to secondary screen
...
tput rmcup # switch back to primary screen

Mặt khác, cho xtermvà có lẽ đối với hầu hết các trình giả lập thiết bị đầu cuối khác, điều này:

printf '\e[7\e[?47h'

nên chuyển sang màn hình phụ và điều này:

printf '\e[2J\e[?47l\e8'

nên quay trở lại chính (và đặt con trỏ trở lại vị trí cũ).

tcsh có một echotclệnh tích hợp, vì vậy bạn có thể làm:

tcsh -c 'echotc ti'
...
tcsh -c 'echotc te'

(hoặc chỉ sử dụng echotctrực tiếp nếu bạn đang sử dụng tcsh).


1
tput smcuptput rmcupdường như để làm công việc.
Tyilo

2
Nếu bạn định mã hóa mã thay vì sử dụng tput, hãy thử hiện đại 1049thay vì 47. Điều này đã được Xterm giới thiệu và được hỗ trợ bởi một số trình giả lập thiết bị đầu cuối khác. Nó xóa màn hình thay thế khi chuyển sang màn hình và để nguyên nội dung khi chuyển trở lại (để bạn có thể xem / sao chép nội dung sau khi chương trình toàn màn hình đã thoát).
Chris Trang

2
Để mạnh mẽ, nếu ngôn ngữ kịch bản của bạn hỗ trợ nó, hãy sắp xếp để chuyển sang màn hình chính ngay cả khi chương trình của bạn thoát sớm. Ví dụ, trong tập lệnh Bash, bạn có thể cài đặt trình xử lý tín hiệu trap 'tput rmcup' EXIT.
Chris Trang

3

Đây được gọi là “thay thế màn hình” (và như t o p hits google hiển thị, bạn là bất thường trong thích tính năng này). Một số thiết bị đầu cuối hỗ trợ hai bộ đệm màn hình, một được sử dụng bởi các ứng dụng toàn màn hình, cái còn lại được sử dụng bởi các ứng dụng hướng dòng. Bash không biết gì về họ. Nếu một lệnh chỉ đơn giản là phát ra đầu ra đến thiết bị đầu cuối, bạn có thể sử dụng các chuỗi điều khiển đầu cuối để chuyển sang màn hình phụ và quay lại (các lệnh này được ghi trong xterm ctlseqs ).

printf '\e[?47h'; mycommand; printf '\e[?47l'

Lưu ý rằng không có cuộn ngược lại cho màn hình thay thế, vì vậy bạn sẽ chỉ nhìn thấy màn hình đầu ra cuối cùng. Nếu đó là một vấn đề, chỉ cần làm điều đơn giản:

mycommand | less 

Chỉ có hai bộ đệm màn hình. Nếu bạn muốn nhiều hơn, hãy sử dụng bộ ghép kênh màn hình thích hợp như Screen hoặc Tmux .


Tôi ngạc nhiên khi thấy nó không thích nó như thế nào. Tôi thực sự thích có thể chạy một trình soạn thảo và vẫn thấy lịch sử lệnh của tôi khi tôi hoàn thành.
Keith Thompson

Sẽ có những dòng trống còn lại sau khi thực hiện điều này trong nhiệm kỳ của tôi: cl.ly/Cz4N cl.ly/Cznp
Tyilo

0

Bash không biết gì về màn hình (thực tế nó có thể chạy mà không bị nhìn thấy). Mặc dù vậy, bạn có thể chuyển hướng cả đầu ra tiêu chuẩn và lỗi tiêu chuẩn sang bất kỳ tệp hoặc đường ống nào.


0

Không có câu trả lời hiện tại nào có vẻ hoạt động trên máy của tôi, nhưng tôi phát hiện ra lệnh có tên screen, có vẻ như là mánh khóe cho tôi.


Không hoàn toàn giống như vậy, nhưng nếu nó phù hợp với mục đích của bạn ... Trình giả lập thiết bị đầu cuối nào bạn đang sử dụng? Tôi nghĩ xtermcó một tùy chọn để (en | dis) có thể kiểm soát các chuỗi đó; những người khác có thể làm như là tốt.
Keith Thompson

Tôi đang sử dụng iTerm 2 cho OS X.
Tyilo
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.