LoginSignup
6
4

More than 5 years have passed since last update.

プロンプトに活動限界時間を表示する

Posted at

私は18:00になると稼働できなくなるうえ、ひきざんがにがてなので残り時間で表示しようと思います。

リアルタイムなタイマーでもないので現在時刻を表示する系の亜種です。
時間計算大変だったよー備忘録。

完成品

image.png

eva.fish
function eva
    set now   (date +%s)
    set limit (date -d '18:00' +%s)
    set remaining (expr $limit - $now)

    set sec (expr $remaining \% 60)
    set min (expr \( $remaining \% 3600 \) / 60)
    set hrs (expr $remaining / 3600)

    printf "%d:%02d:%02d" $hrs $min $sec
end

プロンプト表示は単純に関数をechoすればいいです。

fish_right_prompt.fish
function fish_right_prompt
    if [ $status -eq 0 ]
        set_color magenta
        echo "(゚ー゚*)  "
    else
        set_color blue
        echo "(=ω=.) "
    end
    if not set -q __fish_prompt_regalias
        # グローバルにしないと毎回変わるよ
        set -g __fish_prompt_regalias (regalias)
    end
    echo (eva |golor)" "
    set_color cyan
    echo "$__fish_prompt_regalias"
    #set_color yellow
    #echo -n $USER
    #set_color normal
    #echo -n '@'
    #set_color red
    #hostname
end

編集面倒なので今使っているものを貼り付けましたが、
echo (eva)でOK

関数名がevaなのは

image
エヴァンゲリオン風カウントダウン – edius…?

定時以降働きたくないということで
動きが止まるイメージ+コロン区切りのカウントダウン表示=エヴァ
でした。

S2機関もないです。

つまづき

今日の18時求められない問題

検索では
date -d '10 day'
など単語でフォーマットを指定するものばかりが引っかかったので、類推からdateの柔軟さに賭けて
date -d '18:00'
で取れた。これで「今日の」が前提になるのは助かる。

時刻の引き算

ShellScriptの日付操作の貧弱さに泣いた…

シェルスクリプトで時間計算を一人前にこなす - Qiita

シェルスクリプトが敬遠される理由の一つ。それは時間の計算機能が弱いところだ。

風邪ひいた, シェルスクリプトで時間差を求める - Days of Speed(2013-01-07)

これで+%sでUNIX時間に変換できて、単純な引き算で差秒が導き出せることがわかった。

    set now   (date +%s)
    set limit (date -d '18:00' +%s)
    set remaining (expr $limit - $now)

秒数のH:i:s化

差分の秒はUNIX時間とは関係ないので、これをUNIX時間として変換すると1970年にタイムスリップしてしまう。

でも時間は時間なので簡単に変換してくれると思いきや、自作せねばならぬもよう…

いくつかあったが、これを採用した。

bashの計算式で、秒数をHH:MM:SSフォーマットに変換する - Qiita

i=6789
((sec=i%60, min=(i%3600)/60, hrs=i/3600))
timestamp=$(printf "%d:%02d:%02d" $hrs $min $sec)
echo $timestamp
    set sec (expr $remaining \% 60)
    set min (expr \( $remaining \% 3600 \) / 60)
    set hrs (expr $remaining / 3600)

    printf "%d:%02d:%02d" $hrs $min $sec

エスケープ問題

exprの式が通らなくて躓いた。

fish?

すでにコードで見られるように、%をエスケープしなければならない。

expr

更に、()もエスケープせねばならず、さらにさらに前後にスペースをつけなければならない。

exprは普段使わないので、つまづきまくった。

expr代替探し問題

exprの使い方を探す中で

シェルで変数のインクリメントに expr を使うと100倍遅い件 - Qiita

を見つけて、では((...))をつかうか…としたらfishはPOSIX互換ではないので使えなし。

Bash $((算術式)) のすべて - A 基本編 - Qiita

代替を探すも見つからなく…

fishからbashのletを呼び出してちょっと計算する - Qiita

fishでは,計算は基本的にmathコマンドにやってもらうことになっています.

math:bcを召喚して強力数値計算!exprなんていらない

コマンドライン上で計算する方法まとめ【UNIX】【Windows】 | バシャログ。

最近はやりの fish には、 math というコマンドが用意されています。
math を使うと、 expr よりも高度な計算ができます。

私がしたいのは高度な計算ではなく単純な四則演算の低度な計算なわけで。

その場合、主に速度面でmathを採用するメリットを記事単位で探し出せなかったのでexprのままとしました。
この回り道もなかなか時間を使った。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4