it-swarm-ja.com

zshの最初のコマンドからどれくらいの時間が経過したか

これを実行することにより コマンド

❯ fc -l -1 | awk 'END{print $1}'
8845

履歴ファイルに8845コマンドがあることがわかります。そして、私は zsh を使用しているので、履歴ファイルは次のようになります。

❯ head $HISTFILE                    
: 1575981231:0;exit 
: 1575981278:0;git clone --depth=1 https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k
: 1575981423:0;clear
: 1575981457:0;exit 
: 1575981463:0;Sudo vim ~/.zshrc
: 1575981490:0;source $_
: 1575981540:0;exit 
: 1575981684:0;git clone https://aur.archlinux.org/yay.git
: 1575981688:0;cd yay
: 1575981692:0;makepkg -si

したがって、次のような最初のコマンドを見つけることができます。

❯ head -n 1 $HISTFILE
: 1575981231:0;exit 

今回はUnix時間だと理解しています。そのコマンドを端末に入力してからどれくらいの時間が経過したかを、次のような読み取り可能な形式で調べたいと思います。2 days, 2 hours, 5 minutes, and 54 seconds

どうやってやるの?

1
Amir A. Shabani

最初に、最初のコマンドのUnix時刻を見つける必要があります。次に、現在の時刻からその時刻を差し引いて、人間が読める形式に変換できます。

❯ awk -F: 'NR==1{print $2}' ~/.zsh_history | tr -d ' ' 
1575981231

このコマンドは、~/.zsh_historyファイルの最初の行を取得し、それを:で区切り、2番目のフィールドを出力します。これは必要な時間です。また、awkの出力からtr -d ' 'にパイプすることにより、余分なスペースを削除します。これで、最初のコマンドの時間ができました。ここで、Unixで現在の時刻が必要です。これは、次のコマンドで簡単に実行できます。

❯ date +'%s'                               
1578207763

あとは、現在の時刻から最初の時刻を引いて変換するだけです。これを行うためのbashスクリプトは次のとおりです。

#!/bin/bash
# tsfc - time since first command
function display_time {
    local T="$1"
    local D="$((T/60/60/24))"
    local H="$((T/60/60%24))"
    local M="$((T/60%60))"
    local S="$((T%60))"

    (( $D > 0 )) && printf '%d days, ' $D
    (( $H > 0)) && printf '%d hours, ' $H
    (( $M > 0)) && printf '%d minutes, ' $M
    (( $D > 0 || $H > 0 || $M > 0)) && printf 'and '
    printf '%d seconds\n' $S
}

first="$(awk -F: 'NR==1{print $2}' ~/.zsh_history | tr -d ' ')"
now="$(date +'%s')"
difference=$((now - first))

display_time $difference

このスクリプトの関数は nix.StackExchangeでのStéphaneGimenezの回答 から取得され、人間が読める形式で与えられた時間(秒単位)を表示します。

これで、そのスクリプトをファイルに書き込んで実行可能にし、/usr/binにコピーして、実行するたびに、zshで最初に実行したコマンドから経過した時間を確認できます。

tsfc howto

1
Amir A. Shabani