Cách hiển thị đồng hồ đang chạy trong terminal trước dấu nhắc lệnh


40

Tôi thích sử dụng thiết bị đầu cuối và dành phần lớn thời gian sử dụng nó. Tôi đang tìm kiếm một cách để xem thời gian trong thiết bị đầu cuối trong khi tôi sử dụng nó song song. Thời gian sẽ tự động thay đổi khi nó trôi qua. Thật tuyệt vời nếu nó hiển thị bên trái dấu nhắc lệnh của tôi.

Nếu đây là dấu nhắc lệnh của tôi trong terminal:

saurav@saurav-P4I45Gx-PE:~$

Sau đó, tôi muốn xem đồng hồ (thời gian) là:

saurav@saurav-P4I45Gx-PE[06:27:01]:~$

hoặc là

saurav@(06:27:01):~$

hoặc bất kỳ định dạng nào khác. nơi 06:27:01là thời điểm đó. Điều tôi muốn chỉ là hiển thị thời gian thay đổi khi giây trôi qua.

Vậy có cách nào để đạt được điều này?


Bạn có thể đặt biến $PS1(dấu nhắc) để có thời gian, nhưng tôi không chắc nếu thay đổi.
kiri

Bạn có thể chỉ định \@, nhưng thời gian sẽ chỉ được tính lại mỗi lần lời nhắc hiển thị, không phải là thời gian hiện tại.
kiri

2
@muru, Như tôi đã chỉ định trong câu hỏi của mình, câu trả lời đó chỉ hoạt động cho zsh chứ không phải cho bash.
Rosh_Th

2
Nhưng bản thân câu hỏi không phải là về zsh (nó là chung chung), vì vậy tôi đã khuyên G_P đăng câu trả lời ở đó. Với câu trả lời của G_P đã được thêm vào đó, nó đủ điều kiện là bản sao.
muru

1
@muru mà câu hỏi khác đặc biệt muốn thời gian trong dấu nhắc. OP ở đây chỉ muốn nó được in trong thiết bị đầu cuối và không chỉ định rằng nó phải ở trong dấu nhắc.
terdon

Câu trả lời:


74

Tôi không chắc việc đơn giản để đạt được điều này bằng cách sử dụng shell bash mặc định (nhưng tôi không nói rằng điều đó là không thể). Bạn có thể sẽ cần một lệnh / chức năng có thể làm mới dấu nhắc lệnh mỗi giây mà không can thiệp vào bất cứ điều gì bạn gõ trên dấu nhắc.

Các vỏ Z (zsh) có một built-in lệnh, gọi zle, trong đó, khi sử dụng với các reset-promptđối số, lực lượng dấu nhắc để được tái mở rộng, sau đó sẽ hiển thị lại các chỉnh sửa đệm.

Nếu bạn muốn dùng thử, hãy sử dụng các bước sau:

  1. Cài đặt Z shell bằng lệnh này:

    sudo apt-get install zsh
    
  2. Khi bạn chạy zshlần đầu tiên, hãy chọn 0khi bạn được yêu cầu.

  3. Chỉnh sửa ~/.zshrctập tin và thêm các dòng sau:

    setopt PROMPT_SUBST
    PROMPT='%B%F{red}%n@%m%f%F{yellow}[%D{%L:%M:%S}]%f:%F{blue}${${(%):-%~}}%f$ %b'
    TMOUT=1
    
    TRAPALRM() {
        zle reset-prompt
    }
    

    Lưu file và đóng nó lại.

  4. Trong thiết bị đầu cuối của bạn, khi bạn vẫn đang sử dụng zsh, chạy source ~/.zshrchoặc đơn giản là zshđể đặt lại lời nhắc của bạn. Bây giờ lời nhắc của bạn sẽ giống như:

    saurav@saurav-P4I45Gx-PE[1:25:21]:~$
    

    với một số màu sắc.

  5. Nếu bạn thích nó, hãy chạy chsh -s /bin/zshđể thay đổi shell hiện tại của bạn thành /bin/zsh(cần phải đăng nhập lại để thay đổi này có hiệu lực).

  6. Chạy exitnếu bạn muốn thoát khỏi vỏ zsh.

Đây là một screencast 15 giây từ thiết bị đầu cuối của tôi:

chạy đồng hồ trong thiết bị đầu cuối trước dấu nhắc lệnh


4
Điểm thưởng cho screencast. Công cụ mát mẻ thực sự.
MadMike

@SauravKumar Chạy chshđể thay đổi shell mặc định của bạn từ /bin/bashsang /bin/zsh. Bạn phải đăng xuất và đăng nhập lại.
Radu Rădeanu

Trên thực tế tôi đã tạo ra nó .. Nhưng thiết bị đầu cuối mọi lúc sẽ mở Tôi thực hiện zshlệnh để vào chế độ đồng hồ này ..
Saurav Kumar

@ RaduRădeanu: Có hoạt động sau khi đăng nhập cũng như khởi động lại .. Bạn thật tuyệt vời .. Jai Ho !! : P
Saurav Kumar

Điều này không làm việc cho tôi. Sau một giây, nó đóng thiết bị đầu cuối. Tôi đang dùng Linux Mint, nhưng tôi không nghĩ điều đó có vấn đề vì tôi vẫn sử dụng zsh. Có ý kiến ​​gì không?
istrasci

28

Nếu bạn muốn hiển thị thời gian chạy trong thiết bị đầu cuối của mình, bạn có thể sử dụng lệnh này. Nó sẽ hiển thị thời gian ở phía trên bên phải của thiết bị đầu cuối của bạn.

  while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-11));echo -e "\e[31m`date +%r`\e[39m";tput rc;done &

nhập mô tả hình ảnh ở đây

Nhưng lưu ý rằng việc hiển thị thời gian bằng lệnh này đôi khi có thể chồng lấp văn bản có trong thiết bị đầu cuối. Vì vậy, sử dụng lệnh này với một chút thận trọng.

Một cách khác có thể là sử dụng ký tự điều khiển trong PS1

[guru@guru-pc ~]$  PS1='\[\u@\h \T \w]\$'

[guru@guru-pc 11:06:16 ~]$

Nhưng trong phương pháp này thời gian của bạn sẽ chỉ làm mới sau khi nhấn enter.

Nếu bạn muốn phương thức trên vĩnh viễn, hãy thêm lệnh trên (lệnh bạn thích hoặc cả hai) vào ~.bashrctệp của bạn .


Tuyệt quá! Bất kỳ manh mối nào về cách thay đổi màu sắc của đồng hồ?
Giải tích Hiệp sĩ

1
@CalculusKnight, bạn có thể thay đổi mã màu trong lệnh. Bạn có thể tham khảo điều này cho mã màu. misc.flogisoft.com/bash/tip_colors_and_formatted
g_p

1
Điều này hoạt động HOÀN HẢO - cảm ơn bạn rất nhiều. Tôi đang gọi nó từ .bashrc để ngăn chặn một tường lửa quá chủ động phá hủy các kết nối SSH nhàn rỗi.
Criggie

11

Nếu tất cả những gì bạn muốn làm là hiển thị đồng hồ, chỉ cần sử dụng date:

while :; do date +%r; sleep 1 ; done

Điều đó sẽ hiển thị thời gian mỗi giây cho đến khi bạn dừng lại với CtrlC. Nếu bạn muốn nó nằm trên cùng một dòng (ở trên sẽ in một dòng mới mỗi giây), thay vào đó, hãy làm điều này:

while :; do printf '%s\r' "$(date +%r)"; sleep 1 ; done

2

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.

Ảnh chụp màn hình của thiết bị đầu cuối byobu của tôi

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-clocksử 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 datelệnh bằng clearlệnh.

nhập mô tả hình ảnh ở đây

# 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 dotput. 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).

nhập mô tả hình ảnh ở đây

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ập mô tả hình ảnh ở đây

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 datelệ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à \ttoá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ó


1
Điều này sẽ không hiển thị đồng hồ 'đang chạy' như OP muốn. Nó sẽ chỉ thêm thời gian vào dấu nhắc thiết bị đầu cuối.
Parto

2
export PS1='\t$'

kể từ khi tôi thích hiển thị như thông tin nền ít càng tốt trên i thiết bị đầu cuối thường tùy mỗi phiên như một #, $vv (nếu bạn muốn thay đổi nó vĩnh viễn, giải pháp minerz029 là hoàn hảo)

Để sửa đổi nó để hiển thị hiện tại, tôi có thể đi

export PS1='\T$'

cho thời gian ở định dạng 12 giờ. Bạn có thể xem tài liệu bash cho các tùy chọn khác.


1

Thời gian này sẽ chỉ thay đổi khi một dấu nhắc mới được thực thi

Bạn có thể thêm các mục sau vào .bashrc:

export PS1="\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:[\t]:\w\$ "

Mà sẽ sản xuất:

USER@HOST:[12:59:59]:~$ _

Thêm thông tin tại đây: http : //www.thegeek ware.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/#8

Tìm kiếm "8. Tạo lời nhắc của riêng bạn bằng cách sử dụng các mã có sẵn cho biến PS1" trong trang trên.


2
Tôi đánh giá cao thời gian và nỗ lực của bạn, nhưng đây không phải là điều tôi muốn ..
Saurav Kumar

@SauravKumar Vâng, tôi hiểu bạn muốn một chiếc đồng hồ chạy . Tôi không chắc nếu điều đó có thể xảy ra với biến 'PS1', có thể $PROMPT_COMMANDsẽ hoạt động nếu bạn có thể tìm thấy một lệnh hiển thị thời gian đánh dấu.
kiri

Chà, tôi nghĩ bạn có thể làm điều này .. :) Có vẻ như bạn đã đạt được giải pháp ..
Saurav Kumar

Tại sao nó bao gồm \ u hai lần? @SauravKumar
David

@David: Tôi xin lỗi, tôi không biết. Nhưng @ minerz029 có thể sẽ trả lời câu hỏi của bạn. :)
Saurav Kumar

1

Tôi thực sự thích tính năng đồng hồ ncmpcpp , được kích hoạt bởi 0-key (xem ảnh chụp màn hình). Để biết thêm chi tiết về quy trình cài đặt, vui lòng tham khảo bài viết này .

nhập mô tả hình ảnh ở đây


1
watch -t -n1 "date +%T|figlet" sẽ là một cách dễ dàng.
g_p

1

Bị ảnh hưởng bởi g_pSerg Tôi đã cố gắng tạo hàm trong bash. Nó hoạt động, nhưng tôi không chắc rằng nên kiểm tra lệnh ps mỗi giây để xem bash có phải là quy trình fg hay không

prompttime() {
  PSCOLGREEN="\[$(tput setaf 2)\]"
  PSCOLRESET="\[$(tput sgr0)\]"
  PS1="${PSCOLGREEN}\\$ ${PSCOLRESET}[--:--:-- \W] "
  [ "$PROMPTCURRTTY" ] || {
    PROMPTCURRTTYtemp=$(tty)
    PROMPTCURRTTY=${PROMPTCURRTTYtemp//\/dev\//}
    unset PROMPTCURRTTYtemp; }
  PROMPTSTATE="[S]s+"
  while :; do
    sleep 1
    [ "$(ps a | grep "${PROMPTCURRTTY}.*${PROMPTSTATE}.*$(basename $SHELL)")" ] &&
    { tput sc
      tput hpa 3
      echo -en "$(date +%T)"
      tput rc; }
    continue
  done&
}

0

Nếu bạn không bao giờ cần sử dụng debian_chrootthì đó là nơi thuận tiện để đặt thời gian dấu nhắc lệnh được hiển thị bằng cách sử dụng:

export PROMPT_COMMAND='debian_chroot=$(date +%r)'

Nhập cái này vào terminal của bạn và xem thay đổi dấu nhắc lệnh của bạn theo thời gian:

rick@alien:~$ export PROMPT_COMMAND='debian_chroot=$(date +%r)'

(09:14:59 PM)rick@alien:~$ 

Sau khi thời gian được đặt một lần, để có được đồng hồ chạy cập nhật mỗi giây sử dụng:

while sleep 1;do tput sc;tput cup $(($(tput lines)-1)) 1;printf `date +%r`;tput rc;done &

Điều này .gifcho thấy các lệnh đang hoạt động:

Thiết bị đầu cuối thời gian prompt.gif

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.