Câu hỏi này đã làm phiền tôi trong vài ngày và đây là bài đăng được chỉnh sửa của tôi với tất cả các tài liệu tôi đã học. Cụ thể, mục tiêu của tôi là đạt được hiển thị đồng hồ bên cạnh dấu nhắc trong BASH. Giống như Radu Radeanu đã đề cập trong câu trả lời của mình, chìa khóa là tìm một hàm hoặc biến có thể liên tục làm mới dấu nhắc lệnh hoặc vẽ lại màn hình, mà không can thiệp vào màn hình của bạn hoặc bất cứ điều gì bạn gõ. Mặc dù, điều này có thể đạt được với vòng lặp while, như được hiển thị bởi G_P, việc vẽ lại màn hình liên tục với chức năng thông báo gây rối với bất kỳ văn bản nào trên màn hình của tôi ngay khi nó làm mới. Tôi đã đến gần để đạt được những gì OP yêu cầu bằng cách sửa đổi phần nào mã G_P đã đăng, nhưng tôi vẫn tin rằng câu trả lời của Radu là gần nhất với những gì OP muốn. Không cần phải quảng cáo thêm, đây là một số điều tôi '
# 1, Giải pháp ưa thích của tôi: Bộ ghép kênh đầu cuối
Bộ ghép kênh đầu cuối là một phần mềm cho phép chia màn hình đầu cuối thành hai hoặc nhiều màn hình. Đặc biệt, tôi muốn thu hút sự chú ý đến thiết bị đầu cuối Byobu. Trình giả lập thiết bị đầu cuối dựa trên ncurses này, cho phép bạn hiển thị thời gian, tỷ lệ phần trăm CPU, bộ nhớ và toàn bộ các chỉ số khác. Trong ảnh chụp màn hình từ thiết bị đầu cuối byobu của tôi, bạn có thể thấy nhiệt độ cpu, tỷ lệ pin, chất lượng kết nối internet, tần số CPU, RAM, ngày và tất nhiên là thời gian. Nếu bạn chủ yếu quan tâm đến việc liên tục theo dõi những thứ này khi ở trong thiết bị đầu cuối, Byobu là cách để đi. Trên thực tế, tôi đã rất thích nó, tôi đã thiết lập nó để tự động tải trong khi đăng nhập vào tty. Điều khó hiểu duy nhất là trong tty bạn thực sự không thể hợp nhất các cửa sổ riêng biệt - chỉ chuyển đổi giữa các tab với các phím F3 và F4.
Một giải pháp thay thế liên quan đến cửa sổ ghép kênh là sử dụng splitvt
, chia màn hình thành hai phần. Bạn có thể chạy đồng hồ đầu cuối, chẳng hạn như tty-clock
sử dụng lệnh theo dõi với ngày hoặc bạn có thể tự viết mã bằng một tập lệnh. Thêm về điều đó sau. Trong ảnh chụp màn hình, bạn có thể thấy một phần của phần tách với dấu nhắc bash bình thường ở trên và ở phần dưới bạn có thể thấy một tập lệnh đang chạy, chỉ cần liên tục làm mới đầu ra của date
lệnh bằng clear
lệnh.
# 2, While Do Loop và tput
Đây có lẽ là sự gần gũi với những gì người hỏi câu hỏi muốn thực hiện với bash.
G_P đã đăng một giải pháp tuyệt vời liên quan đến các lệnh while do
và tput
. Tuy nhiên, trong mã của G_P, có hai điều tôi không thích. Thứ nhất, đồng hồ ở bên phải của dấu nhắc và hai - vì chu kỳ ngủ là 1 giây (tham khảo mã gốc có ghi là ngủ), màn hình được vẽ lại mỗi giây và điều đó làm rối tung đầu ra của tôi. Những gì tôi đã làm là chỉnh sửa dấu nhắc bash của tôi thành một dòng thấp hơn với toán tử \ n và thay đổi mã của G_P để toán tử điều khiển sẽ đặt đồng hồ ngay phía trên dấu nhắc và làm mới sau mỗi 60 giây; cho phép tôi xem giờ và phút (và tôi không quan tâm chính xác về phút), trong khi vòng lặp của đồng hồ không làm rối màn hình của tôi. Đầu tiên, đây là lời nhắc của tôi:
PS1='${debian_chroot:+($debian_chroot)}\n[*\u@Ubuntu*]\n $(date) :\w\$ '
Và đây là mã sửa đổi của G_P: enter code here
while sleep 60;do tput sc;tput cup 0 0;date +%R;tput rc;done &
Chỉnh sửa nhỏ : Đôi khi tôi nhận thấy mã này không hiển thị đồng hồ ngay lập tức. Đây là phiên bản tốt hơn: while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done &
Cái này đặt đồng hồ trên màn hình trước, sau đó cho phép bash biết để trải qua chu kỳ ngủ là 60 giây
Lưu ý, cốc thông số 0 0 đặt đồng hồ vào góc trên bên phải của màn hình, ngay phía trên dấu nhắc của tôi và ngủ 60 thay đổi chu kỳ ngủ thành 60 giây, bởi vì cách đó tôi chỉ có thể theo dõi giờ và phút thay vì mỗi giây. Bằng cách này, hầu hết các văn bản tôi có trên màn hình đều không bị ảnh hưởng, đối với hầu hết các phần (chỉ khi tôi tình cờ chạy một lệnh cùng lúc đồng hồ mới được làm mới).
Dòng PS1 đã có trong hồ sơ .bashrc của bạn, vì vậy bạn chỉ cần chỉnh nó một chút. Vòng lặp while do nên được thêm vào đâu đó trong cùng một tệp, tốt nhất là cuối cùng với # bình luận rằng đây là thứ bạn đã thêm ban đầu. Và đừng quên luôn sao lưu bất kỳ tệp nào như vậy chỉ trong trường hợp bạn tạo bubu và cần quay lại như cũ.
# 3, Scripting và khác
Phần này chỉ dành cho những người muốn xem thời gian. Đối với những người muốn liên tục theo dõi nó, # 1 và # 2 là các tùy chọn ưa thích.
Vì vậy, như chúng ta đã thấy vòng lặp while do khá hữu ích. Đây là cách bạn có thể tạo đồng hồ với các lệnh vòng lặp, ngày và ngủ.
Nhấn return / enter và về cơ bản bạn sẽ thấy đầu ra của lệnh date hiển thị trên màn hình bị xóa mỗi giây. Nếu bạn không muốn nhập tất cả những điều đó mỗi lần, hãy biến tất cả nội dung này thành tập lệnh:
#!/bin/bash
while true
do
clear;date
sleep 1
done
Bây giờ bạn có thể chạy tập lệnh đó với splitvt trong một phiên bản bash, trong khi làm việc trong tập lệnh khác.
Một giải pháp khác là watch -n1 date
lệnh, sẽ liên tục thực hiện lệnh ngày với thời gian 1 giây.
Kết luận: Tôi đã học được một số điều trong khi cố gắng tìm câu trả lời cho câu hỏi này và tôi hy vọng những phát hiện của tôi đã giúp bạn theo một cách nào đó và tôi hy vọng tôi có thể đóng góp cho câu hỏi này. Byobu terminal IMHO là giải pháp tốt nhất, nhưng hãy tự quyết định, thực hiện một số nghiên cứu và chọn cách nào phù hợp nhất với bạn.
Một số điều tôi đã tìm thấy khi nghiên cứu:
Bài viết gốc của tôi, giải pháp tối giản: Chỉnh sửa tệp ~ / .bashrc của bạn. Tôi thích chỉnh sửa nó bằng nano, vì vậy
nano ~/.bashrc
Đây là một phần của tập tin chỉnh sửa của riêng tôi:
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\$'
else
# PS1='${debian_chroot:+($debian_chroot)}[*\u@Ubuntu*]:\w\$ '
PS1='${debian_chroot:+($debian_chroot)}[*\u@Ubuntu*]\t:\w\$ '
fi
Sau khi tuyên bố khác, dòng đầu tiên được nhận xét bằng # (đây là lời nhắc cũ của tôi), bây giờ dòng thứ hai là dòng bạn muốn và cụ thể là \t
toán tử. Điều đó cho thấy thời gian chạy ở định dạng 24 giờ. Để biết thêm thông tin kiểm tra này . Ngoài ra, một lưu ý nhỏ, tôi đang sử dụng những thứ khác, vì tôi không sử dụng dấu nhắc màu.
Tái bút: Xin vui lòng cho tôi biết nếu tôi nên thêm bất cứ điều gì vào câu trả lời của mình hoặc chỉnh sửa nó theo bất kỳ cách nào, nhưng đối với hầu hết tôi tin rằng đây là câu trả lời có tính kết luận nhất mà tôi có thể đưa ra, và ít nhất cá nhân tôi sẽ không thêm bất cứ điều gì mới cho nó
$PS1
(dấu nhắc) để có thời gian, nhưng tôi không chắc nếu thay đổi.