Voici une fonction shell que j'ai développée aujourd'hui pour résoudre ce problème exact pour moi. Je pense que cela fonctionne plutôt bien. Les instructions d'utilisation complètes sont incluses dans les commentaires.
mis à jour :
Requiert maintenant une nouvelle dépendance, termdown
, pour afficher un compte à rebours dans le terminal.
Si vous voulez utiliser cette fonction shell comme un script, il vous suffit de la copier-coller dans un nouveau fichier avec le shebang #!/bin/sh
comme première ligne. Ensuite, à la fin du fichier, appelez la fonction avec timer "$@"
pour lui transmettre tous les arguments de la ligne de commande.
J'espère que cela répond aux critiques précédemment formulées.
timer() {
# testé sur ubuntu 18.04
# installation : copiez-collez cette fonction shell dans votre ~/.bashrc ou ~/.profile
# dépendances du programme
# pour installer les dépendances manquantes sur ubuntu
# # sudo apt-get install -y xcowsay
# # sudo snap install -y termdown
# cette fonction shell utilise également `paplay` (pour émettre un son beep / ding)
# et `pgrep` pour vérifier quand une fenêtre xcowsay a été cliquée sur et fermée
# (cependant, sur ubuntu desktop 18.04, à la fois `paplay` et `pgrep` sont déjà installés par défaut)
# exemples d'utilisation
# la chaîne d'entrée est analysée par la commande date unix. testé avec "date (GNU coreutils) 8.28"
# ... cette version de date semble capable de comprendre et de traduire ces chaînes lisibles par l'homme
# timer "1h1m30s"
# timer"1h 1m 30s"
# timer "1 minute 30 secondes"
# timer "15 minutes"
# timer "2 heures 30 minutes"
# timer "00:45:00" # = "45 minutes"
# timer "00:00:45" # = "45 secondes"
# timer "1:1:1" # = 1 heure, 1 minute et 1 seconde
# commencer
_time="$1"
_bell_repeat_delay="3"
# convertir la chaîne d'entrée en secondes, et attendre jusqu'à la fin du temps
# _seconds="$(local epoch=$(date --utc -d @0 +%F); date --utc -d "$epoch $time" +%s.%09N)"
if echo "$_time" | grep -q -E '^[0-9]+$'; then
_seconds="$_time"
else
_date_flag="$(echo "$_time" | sed -e "s/s/SECONDS/g" -e "s/m/MINUTES/g" -e "s/h/HOURS/g")"
_seconds="$(date -d "1970-01-01 00:00:00 UTC ${_date_flag}" "+%s")"
fi
_critical="$(echo $_seconds / 10 | bc)"
if [ $_seconds -lt 60 ]; then
_critical=20
elif [ $_seconds -lt 100 ]; then
_critical=30
elif [ $_seconds -lt 200 ]; then
_critical=40
elif [ $_seconds -lt 300 ]; then
_critical=60
fi
# sleep _seconds && \
termdown --critical $_critical --voice en $_seconds && \
(
# gérer ctrl+c de manière élégante
trap "killall -q xcowsay; exit 1" INT
# afficher des notifications sur tous les moniteurs, 1 notification par moniteur
i=0; num_monitors="$(xrandr -q| grep " connected" | wc -l)"
while [ "$i" -lt "$num_monitors" ]; do
# cette commande affiche la notification elle-même, et est personnalisable
xcowsay --monitor=$i --time=0 --cow-size=large "$time is up" &
i="$(expr $i + 1)"
done
_sound_file_timer_expired="/usr/share/sounds/gnome/default/alerts/drip.ogg"
_sound_file_remind_repeat="/usr/share/sounds/freedesktop/stereo/complete.oga"
audacious --pause
# play -v15 "$_sound_file_timer_expired"
paplay "$_sound_file_timer_expired"
while true; do
# détecter si des notifications ont été fermées, puis sortir de manière élégante
num_cows="$(pgrep -c xcowsay)"
[ "$(expr $num_monitors - $num_cows)" -gt 0 ] && break
# émettre un son d'alerte audible de type ding ou beep répété lentement
paplay "$_sound_file_remind_repeat"
sleep $_bell_repeat_delay || break
done
# fermer toutes les notifications, lorsqu'elles sont affichées sur plusieurs moniteurs
killall -q xcowsay
trap - INT
)
}