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


40

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

これが端末のコマンドプロンプトの場合:

saurav@saurav-P4I45Gx-PE:~$

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

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

または

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

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

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


$PS1(プロンプト)変数に時間を設定することもできますが、変更されるかどうかはわかりません。
キリ

を指定できます\@が、時間は現在の時間ではなく、プロンプトが表示されるたびに再計算されます。
キリ

2
@muru、私の質問で指定したように、その答えはbshではなくzshでのみ機能します。
Rosh_Th 14

2
ただし、質問自体はzshに関するものではないため(一般的です)、G_Pに回答を投稿するようアドバイスしました。G_Pの回答がそこに追加されたので、それはだまされたとみなされます。
ムル14

1
@muruは、他の質問がプロンプトの時間を特に必要としていることを示します。ここでのOPは、端末に出力することを望んでおり、プロンプトに表示する必要があることを指定していません。
テルドン

回答:


74

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

Zシェル(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. exitzshシェルを終了する場合に実行します。

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

コマンドプロンプトの前にターミナルでクロックを実行する


4
スクリーンキャストのボーナスポイント。確かにクールなもの。
MadMike

@SauravKumar実行がchshからあなたのデフォルトのシェルを変更する/bin/bash/bin/zsh。ログアウトしてから再度ログインする必要があります。
ラドゥラディアナヌ

実際に私はそれを作った..しかし、すべての時間のターミナルは、私が実行してきましたが開きますzsh。これクロックモードに入るためのコマンドを
Sauravクマール

@RaduRădeanu:はい、ログイン後も再起動後も動作しました。素晴らしいです。:P
Saurav Kumar

これはうまくいきません。1秒後、ターミナルを閉じます。私はLinux Mintを使っていますが、zshをまだ使用しているので、それが問題になるとは思いませんでした。何か案は?
イストラシ

28

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

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

ここに画像の説明を入力してください

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

別の方法は、PS1で制御文字を使用することです

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

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

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

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


すばらしいです!時計の色を変更する方法についての手がかりはありますか?
微積分騎士

1
@CalculusKnight、コマンドの色コードを変更できます。これをカラーコードで参照できます。misc.flogisoft.com/bash/tip_colors_and_formatting
g_p

1
これは完璧に機能します-ありがとうございます。.bashrcから呼び出して、過度に先を見越したファイアウォールがアイドル状態のSSH接続を強制終了しないようにします。
クリギー

11

時計を表示するだけなら、次を使用しますdate

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

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

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

2

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

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

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

私のびょうぶ端末のスクリーンショット

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

ここに画像の説明を入力してください

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

G_Pは関与素晴らしい解決策掲載しているwhile dotputのコマンドを。しかし、G_Pのコードには、私が気に入らない2つのことがありました。1つは、クロックがプロンプトの右側にあり、2つは-スリープサイクルが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 &

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

tput cup 0 0は画面の右上隅に時計を配置し、プロンプトのすぐ上にスリープします。sleep60はスリープサイクルを60秒に変更します。このように、画面にあるテキストはほとんど影響を受けません(クロックが更新されるのと同じ時間にコマンドを実行する場合のみ)。

ここに画像の説明を入力してください

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

#3、スクリプト作成およびその他

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

したがって、while doループは既に見てきたように非常に便利です。ここでは、while do loop、date、およびsleepコマンドを使用してクロックを作成する方法を示します。

ここに画像の説明を入力してください

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

#!/bin/bash

while true
do
clear;date
sleep 1
done

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

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

結論として:この質問に対する答えを見つけようとしていくつかのことを学びました。私の発見が何らかの形であなたの助けになることを望み、この質問に貢献できたと思います。ビョーブターミナル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時間形式で示しています。詳細情報については、チェックアウトこれを。また、小さなメモですが、色付きのプロンプトを使用していないため、他のものを使用しています。

PS:答えに何かを追加するか、何らかの方法で編集する必要があるかどうかを教えてくださいそれに新しい。


1
これは、OPが望むように「実行中の」クロックを表示しません。ターミナルプロンプトに時間を追加するだけです。
パート14

2
export PS1='\t$'

私は、端末I上可能な限り少しの背景情報として表示することを好むので、一般的にすべてのセッションをカスタマイズする#$など(あなたが永続的に変更したい場合は、minerz029のソリューションが最適です)

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

export PS1='\T$'

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


1

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

に次を追加できます.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変数に使用可能なコードを使用して独自のプロンプトを作成」を検索します。


2
あなたの時間と努力に感謝しますが、これは私が望んでいることではありません。
SauravKumar

@SauravKumarはい、ランニングクロックが必要だと思います。'PS1'変数でそれ$PROMPT_COMMANDが可能かどうかはわかりませんが、カチカチと音を立てる時間を表示するコマンドを見つけることができればおそらく動作するでしょう。
キリ

さて、私はあなたがこれを行うことができると思います.. :)あなたが解決策の近くに達したようです...
Sauravクマール

なぜ\ uが 2回含まれているのですか?@SauravKumar-
デビッド

@David:すみません、わかりません。しかし、おそらく@ minerz029があなたの質問に答えるでしょう。:)
Saurav Kumar 14年

1

-keyによってトリガーされる0ncmpcpp クロック機能が本当に好きです(スクリーンショットを参照)。インストール手順の詳細については、この投稿を参照してください。

ここに画像の説明を入力してください


1
watch -t -n1 "date +%T|figlet" 簡単な方法でしょう。
g_p 14

1

影響を受けg_pSerg私はbashで関数を作成してみました。動作しますが、psコマンドを1秒ごとにチェックして、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&
}

0

使用する必要がない場合は、次を使用し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は、実行中のコマンドを示しています。

時間端末prompt.gif

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.