Codebox Software
Meditation Timer Shell Script
Published:
A meditation timer shell script for macOS. The script should also work on Linux with only minimal changes (just replace afplay
with whatever command-line mp3 player you have on your system).
To begin a session simply run the script along with the number of minutes you wish to practice for. For example, to start a 30 minute session:
zen.sh 30
If you don't specify how long the session should be, the default length of 60 minutes will be used.
The script shows a progress bar, and will play a bell every 10 minutes. At the end of the session a different bell will sound. To turn off the interval bell, change the value of PLAY_INTERVAL_BELL
to false
.
The script records how long you have practiced for, and will display your current total at the end of each session. If you need to finish a session early press Ctrl+C, your time will still be recorded.
Source Code
#!/usr/bin/env bash INTERVAL_BELL_URL=https://codebox.net/assets/audio/bell1.mp3 ENDING_BELL_URL=https://codebox.net/assets/audio/bell2.mp3 MINUTE_MARKER=. INTERVAL_MARKER=+ LOG_FILE=~/.zen_log PLAY_INTERVAL_BELL=true function play { LOCAL_FILE=$TMPDIR/${1}.mp3 if [ ! -f $LOCAL_FILE ]; then URL_VAR=${1}_URL URL=${!URL_VAR} curl -s -o $LOCAL_FILE $URL fi afplay $LOCAL_FILE & } function print_time { PREFIX=$1 MINUTES=$2 echo "$PREFIX $(( MINUTES / 60 )) hours $(( MINUTES % 60 )) minutes" } function log { echo print_time "This session:" $MINUTES if [[ -f $LOG_FILE ]]; then PREV_MINUTES=$(<$LOG_FILE) NEW_MINUTES=$(( PREV_MINUTES + MINUTES )) else NEW_MINUTES=$MINUTES fi echo $NEW_MINUTES > $LOG_FILE print_time "All sessions:" $NEW_MINUTES } DEFAULT_SESSION_LENGTH_MINUTES=60 SESSION_LENGTH_MINUTES=${1:-$DEFAULT_SESSION_LENGTH_MINUTES} INTERVAL_LENGTH_MINUTES=10 MINUTES=0 if [[ ! $SESSION_LENGTH_MINUTES =~ ^[1-9][0-9]*$ ]]; then echo "Usage: $0 [minutes]" exit 1 fi clear play INTERVAL_BELL trap break SIGINT while :; do sleep 60 MINUTES=$((MINUTES + 1)) if [[ $MINUTES -eq $SESSION_LENGTH_MINUTES ]]; then echo -n $INTERVAL_MARKER break fi if [[ $(( MINUTES % INTERVAL_LENGTH_MINUTES )) -eq 0 ]]; then echo -n $INTERVAL_MARKER $PLAY_INTERVAL_BELL && play INTERVAL_BELL else echo -n $MINUTE_MARKER fi done log $MINUTES play ENDING_BELL