web-dev-qa-db-ja.com

コマンドプロンプトの前にターミナルで実行中の時計を表示する方法

私は、ターミナルを使用することを好み、ほとんどの時間を使用します。私はそれを並行して使用しながら、ターミナルで時間を見る方法を探しています。時間が経過すると、時間は自動的に変わります。私のコマンドプロンプトに左を表示すると素晴らしいでしょう。

これが私のコマンドプロンプトである場合:

saurav@saurav-P4I45Gx-PE:~$

次に、clock(time)を次のように見たいです。

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

または

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

またはその他の形式。ここで、06:27:01は時刻です。私が欲しいのは、秒が経過すると変化する時間を表示することです。

これを達成する方法はありますか?

40
Saurav Kumar

デフォルトのbashシェルを使用してこれを実現するのがそれほど簡単かどうかはわかりません(しかし、不可能だとは言いません)。おそらく、プロンプトで入力したものに干渉することなく、コマンドプロンプトを毎秒更新できるコマンド/関数が必要になるでしょう。

Z Shell(zsh) にはzleという組み込みコマンドがあり、reset-Prompt引数とともに使用すると、プロンプトが強制的に再展開されます。編集バッファーを再表示します。

試してみたい場合は、次の手順を使用します。

  1. 次のコマンドでZシェルをインストールします。

    Sudo apt-get install zsh
    
  2. zshを初めて実行するとき、尋ねられたら0を選択します。

  3. ~/.zshrcファイルを編集して、次の行を追加します。

    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
    }
    

    ファイルを保存して閉じます。

  4. ターミナルで、まだzshを使用しているときに、source ~/.zshrc、または単にzshを実行して、プロンプトをリセットします。これで、プロンプトは次のようになります。

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

    いくつかの色で。

  5. 必要に応じて、chsh -s /bin/zshを実行して現在のシェルを/bin/zshに変更します(この変更を有効にするには再ログインが必要です)。

  6. Zshシェルを終了する場合は、exitを実行します。

これが私の端末からの15秒間のスクリーンキャストです。

running clock in terminal before the command Prompt

73
Radu Rădeanu

端末で実行時間を表示する場合は、このコマンドを使用できます。端末の右上に時刻が表示されます。

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

enter image description here

ただし、このコマンドを使用して時間を表示すると、端末に表示されるテキストと重なる場合があることに注意してください。したがって、このコマンドはほとんど注意せずに使用してください。

別の方法はPS1で制御文字を使用している可能性があります

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

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

ただし、この方法では、Enterキーを押した後にのみ時間が更新されます。

上記のメソッドを永続的に使用する場合は、~.bashrcファイルに上記のコマンド(好きなコマンドまたは両方)を追加します。

28
g_p

時計を表示するだけの場合は、dateを使用します。

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

停止するまで毎秒の時間が表示されます CtrlC。同じ行に配置したい場合(上記は毎秒新しい行を印刷します)、代わりにこれを行います:

while :; do printf '%s\r' "$(date +%r)"; sleep 1 ; done
11
terdon
export PS1='\t$'

私は端末にバックグラウンド情報をできるだけ表示することを好まないので、通常、すべてのセッションを#$などとしてカスタマイズします(永続的に変更したい場合は、minerz029のソリューションが最適です)

現在を表示するように変更するには、

export PS1='\T$'

12時間形式の時刻。他のオプションについては、bashのドキュメントをご覧ください。

2
Sojourner

この質問は数日間私を悩ませてきました。そして、ここに私が学んだすべての資料を含む私の編集された投稿があります。具体的には、私の目標は、BASHのプロンプトの横に時計を表示することでした。 Radu Radeanuが彼の答えで言及したように、重要なのは、画面や入力内容に干渉することなく、コマンドプロンプトを常に更新または画面を再描画できる関数または変数を見つけることです。一方、これはG_Pが示すように、whileループで実現できます。tput関数を使用して画面を再描画すると、画面が更新されたときに画面に表示されているテキストが乱れます。 G_Pが投稿したコードを多少変更することで、OPが要求したものを達成することにかなり近づきましたが、それでもRaduの答えはOPが望むものに最も近いと思います。これ以上苦労することなく、私が学んだことのいくつかを、判断のために提示します。

#1、私が好む解決策:ターミナルマルチプレクサ

端末マルチプレクサは、端末画面を2つ以上の画面に分割できるソフトウェアです。特に、By風ターミナルに注目したい。このncursesベースのターミナルエミュレータを使用すると、時間、CPUの割合、メモリ、その他のインジケータ全体を表示できます。ビョブ端末のスクリーンショットでは、CPU温度、バッテリーの割合、インターネット接続の品質、CPU周波数、RAM、日付、そしてもちろん時間を確認できます。ターミナルにいる間にこれらのことを常に監視することに関心がある場合は、By風が最適です。実際、私はそれがとても好きになり、ttyにログインしている間に自動的にロードするように設定しました。唯一の癖は、ttyでは個別のウィンドウを実際にマージできないことです。F3キーとF4キーでタブを切り替えるだけです。

Screenshot of my byobu terminal

多重化ウィンドウを含む代替ソリューションは、画面を2つの部分に分割するsplitvtを使用することです。 tty-clockなどのターミナルクロックを実行したり、watchコマンドで日付を使用したり、スクリプトで自分でコーディングしたりできます。それについては後で詳しく説明します。スクリーンショットでは、スプリットの一部が通常のbashプロンプトで表示され、下部では、dateコマンドの出力をclearコマンドで常に更新するスクリプトが実行されています。

enter image description here

#2、While Do Loopおよびtputこれはおそらく、質問をした人がbashで実装したかったものに最も近いものです。

G_Pは、while doおよびtputコマンドを含む優れたソリューションを投稿しました。しかし、G_Pのコードには、私が嫌いなことが2つありました。 1つは、クロックがプロンプトの右側にあり、2つは-スリープサイクルが1秒であるため(スリープと言う元のコードを参照)、画面が1秒ごとに再描画され、出力が台無しになります。私がやったのは、\ n演算子を使用してbashプロンプトを1行下に編集し、G_Pのコードを変更して、tput演算子がクロックをプロンプトのすぐ上に配置し、60秒ごとに更新することです。時計のループが画面を台無しにすることなく、時間と分を見ることができます(そして、私は正確に分を気にしません)。まず、ここに私のプロンプトがあります:

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

そして、ここにG_Pの変更されたコードがあります:enter code here

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

Small edit:上記のこのコードでは、時々すぐに時計が表示されないことがあります。より良いバージョンは次のとおりです。while true; do tput sc;tput cup 0 0;date +%R;tput rc; sleep 60; done &これは最初に画面に時計を配置してから、bashに60秒のスリープサイクルを経ることを知らせます

Tput cup 0 0は、画面の右上隅、Prompt and sleep 60のすぐ上にクロックを配置することに注意してください。これにより、毎秒ではなく時間と分のみを監視できるため、スリープサイクルが60秒に変更されます。このように、画面上にあるテキストはほとんど影響を受けません(クロックが更新されるのと同じ時間にコマンドを実行する場合のみ)。

enter image description here

PS1行は既に.bashrcプロファイルに含まれているため、少し調整する必要があります。 while doループは、同じファイルのどこかに、できれば最初に追加したものである#コメントで最後に追加する必要があります。また、bubuを作成して元の状態に戻す必要がある場合に備えて、常にそのようなファイルをバックアップすることを忘れないでください。

#3、スクリプティングおよびその他

この部分は、単に時間を見たい人のためのものです。常時監視したい場合は、#1と#2が望ましいオプションです。

そのため、while doループは既に見てきたように非常に便利です。 while doループ、日付、およびスリープコマンドを使用してクロックを作成する方法は次のとおりです。

enter image description here

リターン/エンターを押すと、基本的にクリアされた画面に日付コマンドの出力が毎秒表示されます。毎回すべて入力したくない場合は、このすべてをスクリプトに変換します。

#!/bin/bash

while true
do
clear;date
sleep 1
done

これで、bashの1つのインスタンスでsplitvtを使用してそのスクリプトを実行し、もう1つのインスタンスで作業できます。

別の解決策はwatch -n1 dateコマンドです。これは、1秒の期間で継続的にdateコマンドを実行します。

結論:私はこの質問に対する答えを見つけようとしていくつかのことを学びました、そして私の発見が何らかの形であなたを助けてくれることを願っています私がこの質問に貢献できたことを願っています。ビョーブターミナルIMHOが最適なソリューションですが、自分で決定し、調査を行い、最適な方法を選択してください。

調査中に見つけたもの:

元の投稿、最小限の解決策:〜/ .bashrcファイルを編集します。 nanoで編集するのが好きなので、

nano ~/.bashrc

編集したファイルの一部を次に示します。

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ステートメントの後、最初の行は#(これは私の古いプロンプトです)でコメントアウトされ、2番目の行が必要なもの、具体的には\t演算子になります。これは、実行時間を24時間形式で示しています。詳しくは this をご覧ください。また、小さなメモですが、色付きのプロンプトを使用していないため、他のものを使用しています。

PS:回答に何か追加したり、何らかの方法で編集したりする必要があるかどうかを教えてください。答えは思いつきますが、少なくとも個人的には新しいものは追加しません。

2

この時間は、新しいプロンプトが実行されたときにのみ変更されます

以下を.bashrcに追加できます。

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

生成されるもの:

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

詳細はこちら: http://www.thegeekstuff.com/2008/09/bash-Shell-ps1-10-examples-to-make-your-linux-Prompt-like-angelina-jolie/#8

そのページで「8. PS1変数に使用可能なコードを使用して独自のプロンプトを作成する」を検索します。

1
kiri

g_pおよびSergの影響私はbashで関数を作成しようとしました。それは動作しますが、psコマンドを毎秒チェックしてbashがfgプロセスであるかどうかを確認することは良い考えだとは思いません

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

ncmpcpp クロック機能は、 -key(スクリーンショットを参照)。インストール手順の詳細については、この post を参照してください。

enter image description here

1
v2r

debian_chrootを使用する必要がない場合は、次のコマンドを使用してコマンドプロンプトが表示された時間を入力するのに便利です。

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

これを端末に入力して、コマンドプロンプトが時間とともに変化するのを確認します。

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

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

時間を1回設定した後、1秒ごとに更新される実行中のクロックを取得するには:

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

この.gifは、実行中のコマンドを示しています。

Time terminal Prompt.gif

0