2016-10-17 1 views
0

MIN=1 && for i in $(seq $(($MIN*5)) -1 1); do echo -n "$i, "; sleep 60; done; while :; do beep -r 25 -l 3; sleep 5; donecompte à rebours bas (haut?) Minuterie w/alarme: améliorations?

j'ai décidé récemment d'expérimenter la technique de travail/apprentissage pomodoro et, puisque je travaille habituellement avec un ordinateur, voulait être en mesure de concocter un compte à rebours/minuteur avec alarme qui fonctionne sur la machine que je travaille En bref, je voulais décompter/augmenter soit un intervalle de 25 minutes ou 5 minutes, par minute, puis avoir une alarme sonore - une alarme qui retentira jusqu'à la réinitialisation. En passant, je voulais que ce soit une solution non-gui que je puisse exécuter à partir d'un terminal

En cherchant sur le web, j'ai trouvé quelque chose qui fonctionne (principalement pris de http://www.commandlinefu.com/commands/view/5886/countdown-clock) - voir ci-dessus. Il décompte et affiche le temps restant par minutes et, lorsque l'intervalle spécifié se termine, il joue un schéma de sonnerie distinctif mais relativement non intrusif (utilise le programme "bip") toutes les 5 secondes jusqu'à ce que ctrl + c est entré dans le terminal à partir duquel le script a été exécuté. Comme je l'ai dit, ce que j'ai mis ensemble semble correspondre à mes besoins de façon adéquate. Mais depuis que ma compréhension de bash est assez limitée - comme, en regardant le script, devrait être évidente à quiconque ayant une expérience de bash-scripting - je pensais que je demanderais ici quelles sortes d'améliorations pourraient être apportées à ce script? Peut-il être encore condensé, et/ou peut-être utiliser différents utilitaires pour atteindre le même but, mais d'une manière plus élégante? L'entrée sera appréciée.

PLUS TARD EDIT: La suggestion de Zoltan de remplacer MIN=1 && for i in $(seq $(($MIN*5)) -1 1); par for i in $(seq 5 -1 1); me semble quelque peu simplifier et améliorer le script que j'ai posté. Donc, une version plus raisonnable de ce comme un one-liner serait for i in $(seq 5 -1 1); do echo -n "$i, "; sleep 60; done; while :; do beep -r 25 -l 3; printf " # "; sleep 5; done. La version qu'il a posté semble un script beaucoup plus capable et flexible, donc je vais le marquer comme la meilleure réponse. Bien qu'il soit bon d'avoir une option comme celle disponible, je pense que je vais continuer avec la version que j'ai créée (y compris la légère amélioration suggérée par Zoltan et celle que j'ai inventée qui ajoute un signe de hachage chaque fois que le bip retentit pour me donner une idée, au cas où je devrais quitter l'ordinateur, depuis combien de temps il bipe] - la partie printf " # ") qui a l'intervalle de temps codé en dur dans le script. Merci pour la contribution.

Répondre

1

Je pense que votre script est assez juste.

Je ne vois vraiment pas le point dans le & & à

MIN=1 && for 

cela signifie, si le premier terme est un succès, alors la seule exécution second mandat. Je ne suis même pas sûr, quelle est la valeur logique d'une affectation, mais il est sûr de supposer, c'est un succès. Donc, un

MIN=1; for ... 

devrait suffire.

En ce qui concerne ce 2-liner, l'ensemble MIN = 1 semble inutile, vous pouvez simplement écrire

for i in $(seq 5 -1 1); do ... 

D'autre part, vous voudrez peut-être en mesure de changer le temps imparti, qui peut être réalisé comme ceci:

1) créer un fichier comme beeper.sh

2) rendre exécutable par votre utilisateur

chmod u+x beeper.sh 

ou par tous les utilisateurs:

chmod a+x beeper.sh 

3) écrire votre script dans le fichier, avec un peu tweak:

#!/bin/bash 

# default timeout 
timeout_mins=5 
# while testing your script, making changes, you want this to be something like 1 or 2 
sec_per_min=60 

# check for command line input 
if [ 0 -ne $# ] 
then 
    # assign the first command line param, no check, if it is a number, though! 
    timeout_mins=$1 
fi 

# now it does make sense, to have a variable in the for loop core 
for i in $(seq $timeout_mins -1 1) 
do 
    echo -n "$i, " 
    sleep $sec_per_min 
done 

while : 
do 
    beep -r 25 -l 3 
    sleep 5 
done 

4) exécuter votre script comme celui-ci (à partir du répertoire du fichier de script est in):

# using the default time 
./beeper.sh 

# using 9min 
./beeper.sh 9 

# invalid input: the seq will fail -> the for will fail -> execute the beep 
./beeper.sh bla 
+0

J'ai essayé ce script et il fonctionne selon les lignes que j'avais imaginé. Il est beaucoup plus flexible et capable que ce que j'ai initialement posté. Donc, je vais marquer cette solution comme la meilleure réponse, même si je vais probablement continuer à utiliser une version légèrement modifiée du script que j'ai posté initialement. – MJiller

0

Vous pouvez faire boucle infinie en vous appelera juste beep Je pense que vous ne avez pas besoin que pour le cycle, vous pouvez dormir pendant un bip de temps puis revenir à cet état et l'exécuter sur sous-shell

#infinite loop with beep man beep to understand better -r and -l switch 
time=$((60*5)) 
current=0 
while : 
do 
#echo "Current time is: " 
#date | egrep -o [0-9]+:[0-9]+:[0-9]+ 

    current=$(($current+$time/60)) 
    echo "time of execution : $current min"; 
    beep -r 25 -l 10 
    sleep $time 
done 

Je suis Je ne sais pas si j'ai bien compris votre problème, mais la solution ne dépend que de vous si vous voulez une minuterie qui compte chaque minute, alors la solution ne peut pas être plus facile que ce que vous avez posté ci-dessus.

+0

Cela ressemble beaucoup à mon rendu original - sleep 5m && while:; fais beep -r 25 -l 10; dormir 5; terminé . Cela compte pour 5 minutes - sans faire de bruit - puis, quand les 5 minutes sont écoulées, lance la commande beep spécifiée toutes les 5 secondes jusqu'à ce que la commande soit terminée manuellement (par ctrl c). Je voulais améliorer cette version en ajoutant une minuterie visible qui montrerait, approximativement à l'intérieur de l'intervalle de 5 minutes, le compte à rebours en cours d'exécution était actuellement positionné. Le script que j'ai trouvé m'a permis d'ajouter l'amélioration (compte à rebours numérique) que je cherchais. J'espère que mon objectif est un peu plus clair maintenant. – MJiller

+0

J'ai édité le script ci-dessus, vous pouvez le vérifier, mais une autre réponse est là, alors choisissez une meilleure solution :) – Matovidlo