Open9

コマンドの終了時に自動で音を出したい

Tsuyoshi WatanabeTsuyoshi Watanabe

以下を実行する

$ echo 'a' && say "成功したよーん" || say "失敗したぽよ" 

せいこうしたよーん

Tsuyoshi WatanabeTsuyoshi Watanabe

以下を実行する

$ ecsdfho 'a' && say "成功したよーん" || say "失敗したぽよ" 

しっぱいしたぽよ

Tsuyoshi WatanabeTsuyoshi Watanabe

しかしこれだと毎回打たないといけないので、全てのコマンドの最後に && say "成功したよーん" || say "失敗したぽよ"が自動で付くようにしたい。

Tsuyoshi WatanabeTsuyoshi Watanabe

.zshrcを開く

$ vi ~/.zshrc

以下を追加する

.zshrc
...
function say_command_status {
    if [ $1 -eq 0 ]; then
        say "成功したよーん"
    else
        say "失敗したぽよ"
    fi
}

function preexec {
    # This function will be executed before every command.
    # You can store the command or do other preparations here if needed.
    true
}

function precmd {
    # This function will be executed after every command.
    say_command_status $?
}

変更を反映させる

$ source ~/.zshrc
Tsuyoshi WatanabeTsuyoshi Watanabe

しかしこれだとlsとかcdとか叩いた時にも全て適用されてしまうので、1秒以上かかるコマンドのみ適用したい。

.zshrcを開く

$ vi ~/.zshrc

以下のように修正する

.zshrc
...
function preexec {
    cmd_start_time=$(date +%s)
}

function precmd {
    local last_status=$?
    local cmd_end_time=$(date +%s)
    local cmd_duration=$((cmd_end_time - cmd_start_time))

    if [ $cmd_duration -ge 1 ]; then
        say_command_status $last_status
    fi
}

function say_command_status {
    if [ $1 -eq 0 ]; then
        say "成功したよーん"
    else
        say "失敗したぽよ"
    fi
}

変更を反映する

$ source ~/.zshrc
Tsuyoshi WatanabeTsuyoshi Watanabe

いざ。

$ sleep 2 && echo 'a'

せいこうしたよーん

$ sleep 2 && echasdo 'a'

しっぱいしたぽよ

Tsuyoshi WatanabeTsuyoshi Watanabe

しかしこれだとEnterを押しただけの時にfunction preexec()が走らずに毎回せいこうしたよーんと言うことが発覚、要改善。