When we consider shell scripts, it is usually for some repetitive tasks. It is usually combined with cron
to automate the tasks.
I guess what works for system productivity might as well work for the fun activity of changing the desktop wallpaper. Every hour.
First off, I am using Openbox for my desktop session. For setting the wallpaper, I am using feh to set the wallpaper.
#!/bin/bash # # script to set the wallpaper # # by Nandan Bhat at Linux Training & Certification # on September 25, 2012 # Available under Creative Commons Attribution-ShareAlike 2.5 India (http://creativecommons.org/licenses/by-sa/2.5/in/) License # # random selection of jpeg file from a given folder # or the file (single) given # or from a random jpeg from a default folder # do we have feh? we require it for setting the wallpaper # also note /usr/bin/which is the path in my currently used Linux distribution - Fedora. # change as per your used Linux distribution FEH=$(/usr/bin/which feh 2>/dev/null) FEH_OPTS=" --bg-scale " # no feh? cannot continue, so exit with an error if [ -z "$FEH" ] then echo "[Error] feh is not available. cannot continue. exiting ..." 1>&2 exit 1 fi # echo "[DEBUG] $FEH = $FEH" 1>&2 # do we have a directory supplied from positional parameter 1 ? if [ -n "$1" ] then # echo "[DEBUG] Got $1 = $1" 1>&2 # is it a directory ? if [ -d "$1" ] then BASEDIR="$1" # echo "[DEBUG] positional parameter $1 set as $BASEDIR" 1>&2 # if not a directory, is it a JPEG file? feh can only manage jpegs elif [ $(file "$1" | grep JPEG | wc -l) -eq 1 ] then NUMJPEGS=1 CHOSENFILE="$1" # echo "[DEBUG] $1 set as $CHOSENFILE" 1>&2 fi else # we have not received a directory or a file # use default as /data/wallpapers ### USE YOUR FAVOURITE WALLPAPER LOCATION HERE ### BASEDIR="/data/wallpapers" # echo "[DEBUG] $BASEDIR = $BASEDIR" 1>&2 fi # if we don't have a file chosen already, # we have to choose a random jpeg file if [ -z "$CHOSENFILE" ] then # we need a random file; check if there is at least one jpeg NUMJPEGS=$(file "${BASEDIR}"/* | grep JPEG | wc -l) # echo "[DEBUG] $NUMJPEGS = $NUMJPEGS" 1>&2 # no jpegs among wallpapers? cannot continue with feh then. exit with error if [ $NUMJPEGS -eq 0 ] then echo "[Error] No JPEG files in ${BASEDIR}. exiting ..." 1>&2 exit 2 fi # populate an array with paths of the image files COUNTER=0 # for every image, if it is a jpeg, add path to array element for IMAGEFILE in "${BASEDIR}"/* do file "$IMAGEFILE" | grep -q JPEG if [ $? -eq 0 ] then IMAGESARRAY[$COUNTER]="$IMAGEFILE" # add 1 to COUNTER ((COUNTER++)) # echo "[DEBUG] $IMAGEFILE added to $IMAGESARRAY" 1>&2 fi done # choose a number with $RANDOM bash variable # limit it in range from 0 to COUNTER # this will be the array index position for the image # chosen file is the path stored in array index position CHOSENFILE=${IMAGESARRAY[$RANDOM % $COUNTER]} fi # we should have $CHOSENFILE by now. # nothing left to do but set the wallpaper # echo [DEBUG] "$FEH" "$FEH_OPTS" "$CHOSENFILE" 1>&2 $FEH $FEH_OPTS $CHOSENFILE if [ $? -eq 0 ] then # exit with success exit 0 else echo "[DEBUG] Oops! This script did a boo-boo! Could not set wallpaper with $FEH" 1>&2 exit 3 # end of script
If you feel this script is too elaborate for the purpose, please feel free to comment on it and give us a better one. If you are wondering about the code appearance, it was done with (what else?) a WordPress plugin – Crayon syntax highlighter.
This code was saved in $HOME/bin/set-wallpaper.sh
and was given executable rights, with a crontab
configured to run it every hour. Since cron
is not running in the user session, it is unable to use the graphics (simplified explanation). The crontab
entry must have
DISPLAY=:0.0 $HOME/bin/set-wallpaper.sh