Cara menampilkan jam yang berjalan di terminal sebelum command prompt

40

Saya lebih suka menggunakan terminal dan menghabiskan sebagian besar waktu menggunakannya. Saya mencari cara untuk melihat waktu di terminal sementara saya menggunakannya paralel. Waktu akan berubah secara otomatis ketika lewat. Akan luar biasa jika akan ditampilkan ke command prompt saya.

Jika ini adalah command prompt saya di terminal:

saurav@saurav-P4I45Gx-PE:~$

Maka saya ingin melihat jam (waktu) sebagai:

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

atau

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

atau format lainnya. dimana 06:27:01waktunya? Yang saya inginkan hanyalah menunjukkan waktu yang berubah ketika detik berlalu.

Jadi, apakah ada cara untuk mencapai ini?

Saurav Kumar
sumber
Anda mungkin dapat mengatur $PS1variabel (prompt) agar memiliki waktu, tetapi saya tidak yakin apakah ada perubahan.
kiri
Anda dapat menentukan \@, tetapi waktu hanya akan dihitung ulang setiap kali prompt ditampilkan, bukan waktu saat ini.
kiri
2
@uru, Seperti yang saya sebutkan dalam pertanyaan saya, jawaban itu hanya berfungsi untuk zsh bukan untuk bash.
Rosh_Th
2
Tetapi pertanyaannya sendiri bukan tentang zsh (itu adalah umum), jadi saya menyarankan G_P untuk mengirim jawaban di sana. Dengan jawaban G_P yang sekarang ditambahkan di sana, itu memenuhi syarat sebagai dupe.
muru
1
@muru bahwa pertanyaan lain secara khusus ingin waktu di prompt. OP di sini hanya ingin itu dicetak di terminal dan tidak menentukan bahwa itu harus di prompt.
terdon

Jawaban:

74

Saya tidak yakin itu sangat sederhana untuk mencapai ini menggunakan shell bash default (tapi saya tidak mengatakan itu tidak mungkin). Anda mungkin akan memerlukan perintah / fungsi yang dapat me-refresh prompt perintah setiap detik tanpa mengganggu apa pun yang Anda ketik pada prompt.

The Z shell (zsh) memiliki built-in command, yang disebut zle, yang, bila digunakan dengan reset-promptargumen, pasukan prompt untuk menjadi re-diperluas, maka redisplays edit penyangga.

Jika Anda ingin mencobanya, gunakan langkah-langkah berikut:

  1. Instal Z shell dengan perintah ini:

    sudo apt-get install zsh
    
  2. Ketika Anda menjalankan zshuntuk pertama kalinya, pilih 0kapan Anda diminta.

  3. Edit ~/.zshrcfile dan tambahkan baris berikut:

    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
    }
    

    Simpan file dan tutup.

  4. Di terminal Anda, ketika Anda masih menggunakan zsh, jalankan source ~/.zshrc, atau sederhananya zsh, untuk mengatur ulang prompt Anda. Sekarang prompt Anda akan terlihat seperti:

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

    dengan beberapa warna.

  5. Jika Anda suka, jalankan chsh -s /bin/zshuntuk mengubah shell Anda saat ini /bin/zsh(login ulang diperlukan untuk perubahan ini berlaku).

  6. Jalankan exitjika Anda ingin keluar dari shell zsh.

Berikut adalah screencast 15 detik dari terminal saya:

menjalankan jam di terminal sebelum command prompt

Radu Rădeanu
sumber
4
Poin bonus untuk screencast. Memang keren.
MadMike
@SauravKumar Jalankan chshuntuk mengubah shell default Anda dari /bin/bashmenjadi /bin/zsh. Anda harus keluar dan masuk lagi.
Radu Rădeanu
Sebenarnya saya sudah membuat .. Tapi setiap kali terminal membuka saya sudah menjalankan zshperintah untuk masuk ke modus jam ini ..
Saurav Kumar
@ RaduRădeanu: Ya bekerja setelah login dan juga restart .. Anda hebat .. Jai Ho !! : P
Saurav Kumar
Ini tidak bekerja untuk saya. Setelah satu detik, ia menutup terminal. Saya di Linux Mint, tetapi saya tidak berpikir itu penting karena saya masih menggunakan zsh. Ada ide?
istrasci
28

Jika Anda ingin menampilkan waktu berjalan di terminal Anda, Anda dapat menggunakan perintah ini. Ini akan menampilkan waktu di sisi kanan atas terminal Anda.

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

masukkan deskripsi gambar di sini

Tetapi perhatikan bahwa menampilkan waktu menggunakan perintah ini kadang-kadang dapat tumpang tindih dengan teks yang ada di terminal. Jadi gunakan perintah ini dengan sedikit hati-hati.

Cara lain mungkin menggunakan karakter kontrol di dalam PS1

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

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

Tetapi dalam metode ini waktu Anda akan disegarkan hanya setelah menekan enter.

Jika Anda ingin metode di atas permanen, tambahkan perintah di atas (yang Anda suka atau keduanya) di ~.bashrcfile Anda .

g_p
sumber
Besar! Adakah petunjuk tentang cara mengubah warna jam?
Kalkulus Knight
1
@ CalculusKnight, Anda dapat mengubah kode warna dalam perintah. Anda dapat merujuk ini untuk kode warna. misc.flogisoft.com/bash/tip_colors_and_formatting
g_p
1
Ini bekerja dengan sempurna - terima kasih banyak. Saya memanggilnya dari .bashrc untuk menghentikan firewall yang terlalu proaktif membunuh koneksi SSH yang tidak digunakan.
Criggie
11

Jika yang ingin Anda lakukan adalah menampilkan jam, cukup gunakan date:

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

Itu akan menunjukkan waktu setiap detik sampai Anda menghentikannya CtrlC. Jika Anda ingin berada di baris yang sama (di atas akan mencetak baris baru setiap detik), lakukan ini sebagai gantinya:

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

Pertanyaan ini telah mengganggu saya selama beberapa hari, dan inilah posting saya yang telah diedit dengan semua bahan yang telah saya pelajari. Secara khusus, tujuan saya adalah mencapai menampilkan jam di sebelah prompt di BASH. Sama seperti Radu Radeanu yang disebutkan dalam jawabannya, kuncinya adalah menemukan fungsi atau variabel yang dapat terus-menerus menyegarkan command prompt atau menggambar ulang layar, tanpa mengganggu layar Anda atau dengan apa pun yang Anda ketik. Sementara, ini dimungkinkan untuk dicapai dengan loop sementara, seperti yang ditunjukkan oleh G_P, redrawing konstan layar dengan fungsi tput mengacaukan dengan teks apa pun yang ada di layar saya pada saat itu menyegarkan. Saya sudah hampir mencapai apa yang diminta OP dengan memodifikasi sedikit kode yang diposting G_P, tetapi saya masih yakin jawaban Radu adalah yang paling dekat dengan apa yang diinginkan OP. Tanpa basa-basi lagi, inilah beberapa hal yang saya '

# 1, Solusi pilihan saya: Terminal Multiplexer

Terminal multiplexer adalah perangkat lunak yang memungkinkan pemisahan layar terminal menjadi dua atau lebih layar. Secara khusus, saya ingin menarik perhatian ke terminal Byobu. Emulator terminal berbasis ncurses ini, memungkinkan Anda untuk menunjukkan waktu, persentase CPU, memori, dan sejumlah indikator lainnya. Dalam tangkapan layar dari terminal byobu saya, Anda dapat melihat suhu cpu, persentase baterai, kualitas koneksi internet, frekuensi CPU, RAM, tanggal, dan tentu saja waktu. Jika Anda sebagian besar khawatir dengan terus memantau hal-hal ini saat berada di terminal, Byobu adalah cara untuk pergi. Bahkan, saya sudah sangat menyukainya, saya telah mengaturnya untuk memuat secara otomatis saat masuk ke tty. Satu-satunya kekhasan adalah bahwa dalam tty Anda tidak dapat benar-benar menggabungkan jendela terpisah - hanya beralih di antara tab dengan tombol F3 dan F4.

Cuplikan layar terminal byobu saya

Solusi alternatif yang melibatkan multiplexing windows adalah dengan menggunakan splitvt, yang membagi layar menjadi dua bagian. Anda dapat menjalankan jam terminal seperti tty-clock, menggunakan perintah arloji dengan tanggal, atau Anda dapat membuat kode sendiri dengan skrip. Lebih lanjut tentang itu nanti. Di tangkapan layar Anda dapat melihat satu bagian dari pemisahan dengan bash prompt yang normal di atas, dan di bagian bawah Anda dapat melihat skrip berjalan, yang hanya terus-menerus menyegarkan output dari dateperintah dengan clearperintah.

masukkan deskripsi gambar di sini

# 2, While Do Loop dan tput. Ini mungkin adalah kedekatan dengan apa yang orang yang ingin ajukan ingin lakukan dengan bash.

G_P telah memposting solusi hebat yang melibatkan while dodan tputperintah. Namun dalam kode G_P ada dua hal yang saya tidak suka. Satu, jam berada di sebelah kanan prompt, dan dua - karena siklus tidur adalah 1 detik (merujuk ke kode asli di mana ia mengatakan tidur), layar digambar ulang setiap detik, dan itu mengacaukan output saya. Apa yang saya lakukan adalah mengedit bash prompt saya menjadi satu baris lebih rendah dengan operator \ n dan mengubah kode G_P sehingga operator tput akan menempatkan jam tepat di atas prompt, dan menyegarkan setiap 60 detik; yang memungkinkan saya untuk melihat jam dan menit (dan saya tidak benar-benar peduli tentang menit), sementara loop jam tidak mengacaukan layar saya. Pertama, inilah prompt saya:

PS1='${debian_chroot:+($debian_chroot)}\n[*\u@Ubuntu*]\n $(date) :\w\$  ' 

Dan ini kode modifikasi G_P: enter code here

 while sleep 60;do tput sc;tput cup 0 0;date +%R;tput rc;done &

Edit kecil : Saya perhatikan bahwa kode di atas kadang-kadang tidak langsung menampilkan waktu. Ini versi yang lebih baik: Yang while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done & ini menempatkan jam di layar terlebih dahulu, lalu beri tahu bash untuk menjalani siklus tidur 60 detik

Catatan, cangkir tput 0 0 menempatkan jam ke sudut kanan atas layar, tepat di atas prompt saya dan sleep 60 mengubah siklus tidur menjadi 60 detik, karena dengan cara itu saya hanya dapat memonitor jam dan menit daripada setiap detik. Dengan cara ini, teks apa pun yang saya miliki di layar tidak akan terpengaruh, sebagian besar (hanya ketika saya menjalankan perintah, waktu yang sama jam diperbarui).

masukkan deskripsi gambar di sini

Baris PS1 sudah ada di profil .bashrc Anda, jadi Anda hanya perlu sedikit men-tweak. Loop while do harus ditambahkan di suatu tempat di file yang sama, lebih disukai pada akhirnya dengan # komentar bahwa ini adalah hal yang Anda tambahkan pada awalnya. Dan jangan lupa untuk selalu mencadangkan file seperti itu kalau-kalau Anda membuat bubu dan harus kembali seperti semula.

# 3, Scripting dan lainnya

Bagian ini hanya untuk mereka yang ingin melihat waktu. Bagi mereka yang ingin terus memantaunya, # 1 dan # 2 adalah pilihan yang lebih disukai.

Jadi seperti yang telah kita lihat while do loop cukup berguna. Inilah cara Anda dapat membuat jam dengan sambil melakukan perintah loop, date, dan sleep.

masukkan deskripsi gambar di sini

Tekan kembali / masuk, dan pada dasarnya Anda akan melihat output dari perintah tanggal yang ditampilkan di layar yang dihapus setiap detik. Jika Anda tidak ingin mengetik semua itu setiap waktu, ubah semua ini menjadi skrip:

#!/bin/bash

while true
do
clear;date
sleep 1
done

Sekarang Anda bisa menjalankan skrip itu dengan splitvt dalam satu contoh bash, saat bekerja di yang lain.

Solusi lain adalah watch -n1 dateperintah, yang akan terus menjalankan perintah tanggal dengan periode 1 detik.

Kesimpulan: Saya telah belajar beberapa hal ketika mencoba menemukan jawaban untuk pertanyaan ini, dan saya berharap temuan saya membantu Anda dalam beberapa cara, dan saya berharap saya dapat berkontribusi pada pertanyaan ini. Terminal Byobu IMHO adalah solusi terbaik, tetapi putuskan sendiri, buat riset, dan pilih cara mana yang paling cocok untuk Anda.

Beberapa hal yang saya temukan saat meneliti:

Posting asli saya, solusi minimalis: Edit file ~ / .bashrc Anda. Saya lebih suka mengeditnya dengan nano, jadi

nano ~/.bashrc

Inilah bagian dari file saya sendiri yang diedit:

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

Setelah pernyataan lain, baris pertama dikomentari dengan # (ini adalah prompt lama saya), sekarang baris kedua adalah yang Anda inginkan, dan khususnya \toperator. Itu menunjukkan waktu berjalan dalam format 24 jam. Untuk info lebih lanjut, periksa ini . Juga catatan kecil, saya menggunakan barang-barang setelah yang lain, karena saya tidak menggunakan prompt berwarna.

PS: Tolong beri tahu saya jika saya harus menambahkan sesuatu ke jawaban saya atau mengeditnya dengan cara apa pun, tetapi sebagian besar saya percaya ini adalah jawaban yang paling konklusif yang bisa saya buat, dan setidaknya saya pribadi tidak akan menambahkan apa pun baru untuk itu.

Sergiy Kolodyazhnyy
sumber
1
Ini tidak akan menampilkan jam 'berjalan' seperti yang diinginkan OP. Ini hanya akan menambah waktu ke terminal prompt.
Parto
2
export PS1='\t$'

karena saya lebih suka menampilkan sesedikit info latar belakang mungkin pada i terminal umumnya menyesuaikan setiap sesi sebagai #, $, dll (jika Anda ingin mengubahnya secara permanen, solusi minerz029 adalah sempurna)

Untuk memodifikasinya untuk menunjukkan saat ini, saya bisa menggunakan

export PS1='\T$'

untuk waktu dalam format 12 jam. Anda dapat melihat dokumentasi bash untuk opsi lain.

Sojourner
sumber
1

Waktu ini hanya akan berubah ketika prompt baru dijalankan

Anda dapat menambahkan yang berikut ini ke .bashrc:

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

Yang akan menghasilkan:

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

Informasi lebih lanjut di sini: http://www.thegeekstuff.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/#8

Cari "8. Buat prompt Anda sendiri menggunakan kode yang tersedia untuk variabel PS1" di halaman di atas.

kiri
sumber
2
Saya menghargai waktu dan usaha Anda, tetapi ini bukan yang saya inginkan ..
Saurav Kumar
@SauravKumar Ya, saya mengerti Anda menginginkan jam yang berjalan . Saya tidak yakin apakah itu mungkin dengan variabel 'PS1', mungkin $PROMPT_COMMANDakan bekerja jika Anda dapat menemukan perintah yang menampilkan waktu yang berdetak.
kiri
Yah saya pikir Anda bisa melakukan ini .. :) Sepertinya Anda telah mencapai dekat dengan solusi ..
Saurav Kumar
mengapa itu termasuk \ u dua kali? @SauravKumar
David
@ David: Maaf, saya tidak tahu. Tapi @ minerz029 mungkin akan menjawab pertanyaan Anda. :)
Saurav Kumar
1

Saya sangat suka fitur jam ncmpcpp , dipicu oleh 0-kunci (lihat tangkapan layar). Untuk detail lebih lanjut tentang prosedur instalasi, silakan lihat posting ini .

masukkan deskripsi gambar di sini

v2r
sumber
1
watch -t -n1 "date +%T|figlet" akan menjadi cara yang mudah.
g_p
1

Dipengaruhi oleh g_p dan Serg saya mencoba membuat fungsi di bash. Itu bekerja, tapi saya tidak yakin itu ide yang baik untuk memeriksa perintah ps setiap detik untuk melihat apakah bash adalah proses fg atau tidak

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&
}
Alex Sweetheart
sumber
0

Jika Anda tidak perlu menggunakan debian_chrootmaka itu adalah tempat yang berguna untuk meletakkan waktu prompt perintah ditampilkan dengan menggunakan:

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

Ketik ini di terminal Anda dan perhatikan perubahan prompt perintah Anda seiring waktu:

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

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

Setelah waktu diatur satu kali, untuk mendapatkan jam berjalan yang memperbarui setiap penggunaan detik:

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

Ini .gifmenunjukkan perintah dalam tindakan:

Terminal waktu prompt.gif

WinEunuuchs2Unix
sumber