Issue
I'm looking for a way to send myself a notification for any process that takes over 60 seconds.
To send a notification I can use something like
notify-send -t 1 "hey command finished"
Is there a way I can save a config
file somewhere or automate this behaviour in my zsh
?
Similar to this unanswered question from a different website
Solution
Add to your .zshrc
file:
notify() {
emulate -L zsh # Reset shell options inside this function.
# Fetch the last command with elapsed time from history:
local -a stats=( "${=$(fc -Dl -1)}" )
# = splits the string into an array of words.
# The elapsed time is the second word in the array.
# Convert the elapsed minutes (and potentially hours) to seconds:
local -a time=( "${(s.:.)stats[2]}" )
local -i seconds=0 mult=1
while (( $#time[@] )); do
(( seconds += mult * time[-1] ))
(( mult *= 60 ))
shift -p time
done
(( seconds >= 60 )) &&
notify-send -t 1 \
"hey command '$stats[3,-1]' finished in $seconds seconds"
return 0 # Always return 'true' to avoid any hiccups.
}
# Call the function above before each prompt:
autoload -Uz add-zsh-hook
add-zsh-hook precmd notify
Answered By - Marlon Richert