Komut isteminden önce çalışan bir saatin terminalde gösterilmesi


40

Terminal kullanmayı ve zamanımın çoğunu kullanarak kullanmayı tercih ederim. Paralel kullanırken terminalde zamanı görmenin bir yolunu arıyorum. Zaman geçtiğinde otomatik olarak değişecektir. Komut istemime sol gösterse harika olurdu.

Bu benim terminalimdeki komut istemi ise:

saurav@saurav-P4I45Gx-PE:~$

Sonra saati (zaman) şöyle görmek isterdim:

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

veya

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

veya başka bir formatta. saat nerede 06:27:01? İstediğim sadece saniyeler geçtiğinde değişen zamanı göstermek.

Peki bunu başarmanın bir yolu var mı?


$PS1(Prompt) değişkenini zaman alacak şekilde ayarlayabilirsiniz , ancak değişiklik olup olmadığından emin değilim.
kiri

Belirtebilirsiniz \@, ancak saat yalnızca istem görüntülendiğinde geçerli bir saat değil yeniden hesaplanır.
kiri

2
@muru, Sorumu belirttiğim gibi, bu cevap bash için değil sadece zsh için işe yarıyor.
Rosh_Th

2
Ancak sorunun kendisi zsh ile ilgili değil (genel), bu yüzden G_P'ye cevabı orada göndermesini tavsiye ettim. G_P'nin şimdi yanıtı orada eklendiğinde, bir dupe olarak nitelenir.
muru,

1
@muru bu diğer soru özellikle istemi zaman istiyor. Buradaki OP sadece terminalde yazdırılmasını istiyor ve istemde olması gerektiğini belirtmiyor.
terdon

Yanıtlar:


74

Varsayılan bash kabuğunu kullanarak bunu başarmanın o kadar basit olduğundan emin değilim (ama bunun imkansız olduğunu söylemiyorum). Büyük olasılıkla komut istemine yazdığınız hiçbir şeyi engellemeden her saniye komut istemini yenileyebilen bir komut / işleve ihtiyacınız olacak.

Z kabuğu (zsh) dahili olarak adlandırılan komutu zleile birlikte kullanıldığında, reset-promptbağımsız değişken, kuvvetler hızlı yeniden genleştirilmekte olması, ardından düzenleme tamponu yeniden görüntüler.

Denemek istiyorsanız, aşağıdaki adımları kullanın:

  1. Z kabuğunu bu komutla kurun:

    sudo apt-get install zsh
    
  2. zshİlk defa kaçtığınızda , 0ne zaman isteneceğinizi seçin.

  3. Düzenleme ~/.zshrcdosyası ve aşağıdaki satırları ekleyin:

    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
    }
    

    Dosyayı kaydedin ve kapatın.

  4. Terminalinizde, hala zsh kullanıyorsanız , komut istemini sıfırlamak için çalıştırın source ~/.zshrcveya çalıştırın zsh. Şimdi isteminiz şöyle görünmeli:

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

    Bazı renkler ile.

  5. İsterseniz chsh -s /bin/zsh, geçerli kabuğunuzu değiştirmek için çalıştırın ( bu değişikliğin geçerli olması /bin/zshiçin yeniden giriş yapmanız gerekir).

  6. exitEğer zsh kabuğundan çıkmak istiyorsanız çalıştırın .

İşte terminalimden 15 saniyelik bir screencast:

komut isteminden önce terminalde çalışan saat


4
Screencast için bonus puan. Gerçekten harika şeyler.
MadMike

@SauravKumar Run chshdan varsayılan kabuk değiştirme /bin/bashiçin /bin/zsh. Çıkış yapıp tekrar giriş yapmalısınız.
Radu Rădeanu

Aslında ben yaptım .. Fakat her seferinde terminal açılır zsh. Bu saat moduna girmek için emir verdim ..
Saurav Kumar 17:13

@ RaduRădeanu: Evet, oturum açtıktan sonra yeniden başlatmanın yanı sıra çalıştı .. Jai Ho !! : P
Saurav Kumar

Bu benim için çalışmıyor. Bir saniye sonra terminali kapatır. Linux Nane'deyim, fakat hala zsh kullandığımdan bunun önemli olacağını düşünmedim. Herhangi bir fikir?
istrasci

28

Terminalinizde çalışma süresini görüntülemek istiyorsanız bu komutu kullanabilirsiniz. Terminalinizin sağ üst tarafında zaman gösterecektir.

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

görüntü tanımını buraya girin

Ancak, bu komutu kullanarak zamanın görüntülenmesinin terminalde bulunan metni çakışabileceğini unutmayın. Bu komutu çok dikkatli kullanın.

Başka bir yol PS1’de kontrol karakterini kullanmak olabilir.

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

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

Ancak bu yöntemde zamanınız ancak enter tuşuna basıldıktan sonra yenilenir.

Yukarıdaki metodu kalıcı hale getirmek istiyorsanız, yukarıdaki komutu (sevdiğiniz veya her ikisini de) ~.bashrcdosyanıza ekleyin .


Harika! Saatin rengini değiştirmek için herhangi bir ipucu var mı?
Calculus Knight

1
@CalculusKnight komutunda renk kodunu değiştirebilirsiniz. Renk kodu için buna başvurabilirsiniz. misc.flogisoft.com/bash/tip_colors_and_formatting
g_p

1
Bu mükemmel çalışır - çok teşekkür ederim. Aşırı proaktif bir güvenlik duvarının boşta SSH bağlantılarını öldürmesini engellemek için .bashrc'den arıyorum.
Criggie

11

Tek yapmanız gereken bir saat göstermekse, sadece şunu kullanın date:

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

Bu, siz durdurana kadar her saniye zamanı gösterir CtrlC. Aynı satırda olmasını istiyorsanız (yukarıdaki her saniye yeni bir satır yazacaktır), bunun yerine:

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

2

Bu soru birkaç gündür beni rahatsız ediyor ve işte öğrendiğim materyallerle birlikte yazımı değiştirdim. Özellikle, hedefim BASH’daki komut satırının yanında saati göstermekti. Radu Radeanu'nun cevabında bahsettiği gibi, anahtar, komut istemini sürekli yenileyebilen veya ekranı yeniden çizebilecek, ekranınıza veya ne yazdığınıza müdahale etmeyecek bir işlev veya değişken bulmaktır. Bu, G_P tarafından gösterildiği gibi while döngüsüyle başarmak mümkün olsa da, ekranın tput işleviyle sürekli olarak yeniden çizilmesi, ekranım tazelemeye başladığında ne olursa olsun metinle karışır. OP'nin istediği şeyi G_P kodunu değiştirerek biraz değiştirerek elde etmeye çok yaklaştım ancak Radu'nun cevabının OP'nin istediğine en yakın olduğuna inanıyorum. Daha fazla uzatmadan, işte bazı şeyler.

# 1, Tercih ettiğim çözüm: Terminal Çoklayıcı

Terminal multiplexer, terminal ekranını iki veya daha fazla ekrana bölmeyi sağlayan bir yazılımdır. Özellikle, Byobu terminaline dikkat çekmek istiyorum. Bu ncurses tabanlı terminal emülatörü, zamanı, CPU yüzdesini, hafızayı ve diğer birçok göstergeyi göstermenizi sağlar. Byobu terminalimin ekran görüntüsünde işlemci sıcaklığını, pil yüzdesini, internet bağlantı kalitesini, CPU frekansını, RAM'i, tarihi ve tabii ki zamanı görebilirsiniz. Terminalde sürekli olarak bunları izlemekle ilgileniyorsanız, Byobu gitmenin yolu. Aslında, çok beğenmeye geldim, giriş yaparken tty'ye otomatik olarak yüklenmesini ayarlıyorum. Tek ilginç olan, tty'de aslında ayrı pencereleri birleştiremeyeceğinizdir - yalnızca F3 ve F4 tuşlarıyla sekmeler arasında geçiş yapabilirsiniz.

Byobu terminalimin ekran görüntüsü

Çoklayıcı pencereler içeren alternatif bir çözüm splitvt, ekranı iki parçaya bölen kullanmaktır . Saat tty-clockile watch komutunu kullanmak gibi bir terminal saati çalıştırabilir veya kendiniz bir komut dosyası ile kodlayabilirsiniz. Bundan sonra daha fazlası. Ekran görüntüsünde, normal bash istemi ile bölmenin bir bölümünü üstte görebilir ve alt bölümde ise datekomutun komutunu sürekli olarak yenileyerek çalışan bir komut dosyası görebilirsiniz clear.

görüntü tanımını buraya girin

# 2, Ne zaman Döngü ve giriş yapın Bu muhtemelen soruyu soran kişinin bash ile ne yapmak istediğine yakındır.

G_P while dove tputkomutlarını içeren harika bir çözüm yolladı . Ancak G_P'nin kodunda sevmediğim iki şey vardı. Bir, saat istemin sağındaydı ve iki - uyku döngüsü 1 saniye olduğu için (uyku derken orijinal koda bakın), ekran her saniye yeniden çiziliyor ve bu da çıktımı bozuyor. Yaptığım şey, bash komut istemimi \ n operatörüyle bir satır daha alçak olacak şekilde düzenlemek ve G_P'nin kodunu değiştirmek, böylece tput operatörü saati komut satırının hemen üstüne getirecek ve her 60 saniyede bir yenileyecek; saat ve dakikaları görmemi sağlıyor (ve dakikaları tam olarak umursamıyorum), saatin döngüsü ekranımı karıştırmıyor. İlk önce işte benim istemi:

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

Ve işte G_P'nin değiştirilmiş kodu: enter code here

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

Küçük düzenleme : Yukarıdaki kodun bazen saati hemen göstermediğini fark ettim. İşte daha iyi bir versiyon: while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done & Bu saat önce ekrana geçiyor, sonra 60 saniyelik uyku döngüsünden geçiyor.

Not 0 0 kupası, saati ekranın sağ üst köşesine yerleştirir, istemimin hemen üstünde ve uyku 60, uyku döngüsünü 60 saniyeye değiştirir, çünkü bu şekilde her saniye yerine sadece saat ve dakikaları izleyebilirim. Bu sayede, ekranda hangi metin olursa olsun, etkilenmez, çoğunlukla (sadece aynı saat saatini tazeleyen bir komutu çalıştırdığımda).

görüntü tanımını buraya girin

PS1 hattı zaten .bashrc profilinizde, bu yüzden biraz ayarlamak zorundasınız. While döngüsü, aynı dosyada bir yere, tercihen # yorum ile sonunda eklenmelidir, bu başlangıçta eklediğiniz şeylerdir. Ve bubu yaptığınızda ve eskisi gibi dönmeniz gerektiğinde, böyle bir dosyayı her zaman yedeklemeyi unutmayın.

# 3, Komut Dosyası ve diğer

Bu bölüm sadece zaman görmek isteyenler içindir. Sürekli izlemek isteyenler için, # 1 ve # 2 tercih edilen seçeneklerdir.

Zaten gördüğümüz gibi süre do döngü oldukça yararlıdır. İşte döngü, tarih ve uyku komutları yaparken bir saati nasıl oluşturacağınız.

görüntü tanımını buraya girin

Return / enter tuşuna basın, temelde her saniye temizlenen ekranda gösterilen tarih komutunun çıktısını göreceksiniz. Bunları her seferinde yazmak istemiyorsanız, tüm bunları komut dosyasına dönüştürün:

#!/bin/bash

while true
do
clear;date
sleep 1
done

Şimdi bu betiği splitvt ile bir bash örneğinde, diğerinde çalışırken çalıştırabilirsiniz.

Başka bir çözüm, watch -n1 datetarih komutunu 1 saniyelik bir süre ile sürekli yürütecek olan komuttur.

Sonuç olarak: Bu sorunun cevabını bulmaya çalışırken bazı şeyler öğrendim ve bulgularım bir şekilde size yardımcı oldu ve umarım bu soruya katkıda bulunabilmişimdir. Byobu terminal IMHO en iyi çözümdür, ancak kendiniz karar verin, biraz araştırma yapın ve hangisinin sizin için en uygun olduğunu seçin.

Araştırma yaparken bulduğum bazı şeyler:

Orijinal gönderim, minimalist çözüm: ~ / .bashrc dosyanızı düzenleyin. Ben nano ile düzenlemeyi tercih ediyorum.

nano ~/.bashrc

İşte kendi düzenlenmiş dosyamın kısmı:

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

Else ifadesinden sonra ilk satır # ile yorumlanır (bu benim eski istemimdir), şimdi ikinci satır istediğiniz satır ve özellikle de \toperatördür. Bu 24 saatlik biçimde çalışma süresini gösterir. Daha fazla bilgi için bu göz atın . Ayrıca küçük bir not, diğer şeyleri kullanıyorum, çünkü renkli istemi kullanmıyorum.

Not: Cevabımı bir şey eklemek veya herhangi bir şekilde düzenlemek gerekirse lütfen bana bildirin, ancak çoğunlukla bunun bulabileceğim en kesin cevap olduğuna inanıyorum ve en azından şahsen bir şey ekleyemiyorum. bunun için yeni.


1
Bu, OP'nin istediği gibi 'çalışan' bir saat göstermez. Terminal terminaline sadece zaman ekleyecektir.
Parto

2
export PS1='\t$'

i Terminal i üzerinde mümkün olduğunca az arkaplan bilgi olarak görüntülenmesi tercih beri genellikle olarak her oturumu özelleştirmek #, $vb (kalıcı olarak değiştirmek istiyorsanız, minerz029 çözümü mükemmeldir)

Geçerli göstermek üzere değiştirmek için, gidebilirim

export PS1='\T$'

12 saat biçiminde zaman için. Diğer seçenekler için bash belgelerini görüntüleyebilirsiniz.


1

Bu süre yalnızca yeni bir bilgi istemi yürütüldüğünde değişecek

Aşağıdakileri kendinize ekleyebilirsiniz .bashrc:

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

Hangi üretecek:

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

Daha fazla bilgi burada: http://www.thegeekstuff.com/2008/09/bash-shell-ps1-10-examples-to-make-your-linux-prompt-like-angelina-jolie/#8

Aşağıdaki sayfada "PS1 değişkeni için mevcut kodları kullanarak kendi istemi oluşturun" ifadesini arayın.


2
Zaman ve emeğiniz için minnettarım, ama istediğim bu değil ..
Saurav Kumar

@SauravKumar Evet, koşu saati istediğini biliyorum . Bunun 'PS1' değişkeni ile mümkün olup olmadığından emin değilim, $PROMPT_COMMANDeğer tıklatma zamanı gösteren bir komut bulabilirseniz işe yarayabilir.
kiri

Bence bunu yapabilirsin .. :) Görünüşe göre çözüme
yaklaşmışsın

neden içermektedir u \ iki kez? @SauravKumar
David

@David: Üzgünüm, bilmiyorum. Fakat @ minerz029 muhtemelen sorunuzu cevaplardı. :)
Saurav Kumar

1

-Key tarafından tetiklenen ncmpcpp clock özelliğini gerçekten seviyorum 0(ekran görüntüsüne bakın). Kurulum prosedürü hakkında daha fazla ayrıntı için, lütfen bu yazıya bakın .

görüntü tanımını buraya girin


1
watch -t -n1 "date +%T|figlet" kolay bir yol olurdu.
g_p

1

Etkilenerek g_p ve Serg ben bash işlevini yaratmaya çalışmışlardır. Çalışıyor, ancak bash'ın bir fg işlemi olup olmadığını görmek için ps komutunu her saniye kontrol etmenin iyi bir fikir olduğundan emin değilim.

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

debian_chrootKullanmaya hiç gerek duymazsanız, komut istemini kullanarak görüntülenen zamanı koymak için kullanışlı bir yer:

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

Bunu terminalinize yazın ve zamanla komut istemi değişikliklerinizi izleyin:

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

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

Süre bir kez ayarlandıktan sonra, her saniye kullanımda bir güncellenen çalışan bir saat elde etmek için:

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

Bu .gifişlemdeki komutları gösterir:

Zaman terminali

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.