Open9
コマンドの終了時に自動で音を出したい
環境
- OS: macOS Ventura 13.5
- shell: zsh 5.9 (x86_64-apple-darwin22.0)
以下を実行する
$ echo 'a' && say "成功したよーん" || say "失敗したぽよ"
せいこうしたよーん
以下を実行する
$ ecsdfho 'a' && say "成功したよーん" || say "失敗したぽよ"
しっぱいしたぽよ
しかしこれだと毎回打たないといけないので、全てのコマンドの最後に && say "成功したよーん" || say "失敗したぽよ"
が自動で付くようにしたい。
.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
いざ。
$ echo 'a'
せいこうしたよーん
$ ecsdfho 'a'
しっぱいしたぽよ
しかしこれだと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
いざ。
$ sleep 2 && echo 'a'
せいこうしたよーん
$ sleep 2 && echasdo 'a'
しっぱいしたぽよ
しかしこれだとEnterを押しただけの時にfunction preexec()
が走らずに毎回せいこうしたよーんと言うことが発覚、要改善。