2017-10-27 28 views
0

zshで実行するプログラムの所要時間を測定したいとします。時差に基づいて、撮影した時間を印刷したいと思います。zshで実行するコマンドの実行時間を測定するためのカスタムのaccept-lineを作成します。

my-accept-line() { 
    CMD="$BUFFER" 
    CMDSTART=$(date +%s) 
    zle accept-line 
    CMDRUNTIME=$((($(date +%s)-${CMDSTART}))) 
    if [[ $CMDRUNTIME -ge 100 ]]; then 
    CMDRUNTIME_min=$(($CMDRUNTIME/60)) 
    echo "Last command ran for $CMDRUNTIME_min minutes." 
    fi 
} 

# create a widget from `my-accept-line' with the same name 
zle -N my-accept-line 
# rebind Enter, usually this is `^M' 
bindkey '^M' my-accept-line 

しかし、 "zle accept-line"がバックグラウンドで実行されているようです。そのため、私はいつもCMDRUNTIMEを0にしてしまいます。これに対する回避策はありますか?

答えて

0

preexecprecmd zshフックを使用すると、これを行う方がよいでしょう。

はここ(未テスト)少し例を示します

function pre_exec() { 
    cmd_timestamp=$((EPOCHREALTIME*1000)) 
} 

function pre_cmd() { 
    local stop=$((EPOCHREALTIME*1000)) 
    local start=${cmd_timestamp:-$stop} 
    local elapsed=$stop-$start 
    (($elapsed > 0)) && echo $elapsed 
    unset cmd_timestamp 
} 

zmodload zsh/datetime 
autoload -Uz add-zsh-hook 
add-zsh-hook precmd pre_cmd 
add-zsh-hook preexec pre_exec 

それはあなたのプロンプトの前にミリ秒単位でコマンドを実行するのにかかった時間を表示します - あなたは、これはしかし、あなたがしたいフォーマットするPRE_CMD機能を変更することができます。

より多くの機能を備えた例については、しきい値(デフォルトは500ms)を超えた場合にプロンプ​​トにコマンドタイムスタンプを表示する私のZSHプロンプトテーマのfilthyのソースを見てください。