Create a shell script for a cron job with hidden debug information shown only when executed inside the terminal.
The idea behind this is quite simple as we need to verify if stdin (file descriptor __), stdout (file descriptor 1), or stderr (file descriptor 2) is associated with the terminal. If not, then the shell script is executed as a cron job, so any debug message can be omitted.
#!/bin/bash # cron job template with debug information # display debug information # only if $terminal variable is set to 1 emit() { if [ "$terminal" -eq "1" ]; then printf "%s\n" "$*" fi } # determine if standard input (file descriptor) is opened on a terminal # and set $terminal variable accordingly if [ -t 0 ] ; then terminal=1 else terminal=0 fi emit "Script name is $(basename $0)" emit "Script location is $(readlink -f $0)" emit "Script is executed on $TERM" emit "Script is executed from $PWD directory" emit "Script is executed with $USER permissions" if [ -n "$SUDO_USER" ]; then emit "Script is executed using sudo by $SUDO_USER ($SUDO_UID:$SUDO_GID)" fi emit emit "Script is using path defined as $PATH" emit "Script LANG variable is $(locale | awk -F '=' '/LANG=/ {print $2}')" emit emit "Execution start: $(date)" # perform real operations here emit "Execution end: $(date)"
Sample output inside the terminal.
~# bash bin/cron_job_template.sh
Script name is cron_job_template.sh Script location is /root/bin/cron_job_template.sh Script is executed on screen Script is executed from /root directory Script is executed with root permissions Script is using path defined as /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin Script LANG variable is C.UTF-8 Execution start: Tue Dec 26 13:25:50 UTC 2017 Execution end: Tue Dec 26 13:25:50 UTC 2017