Bash scripts can identify how they got started

I often develop bash scripts which I test by running them in my current terminal, and then when they're working properly (which generally just means that I haven't yet tested the situations where they break), I want to run them as a cron job.

During development (and then later, once I find a situation where the script doesn't work properly), I want to have a reasonable amount of debugging output, but once the script is running as a cron job, I want it to be more or less silent.

Typically, I'd do this by having a line near the top of the script which says debug=1 while I'm developing it and just want some basic output regarding what it's doing, debug=2 if there's a problem and I want all the detail it can give me, and debug=0 once I think it works and I'm running it from cron.

Then, throughout the script, there are various lines such as [ "$debug" -gt 0 ] && echo … or [ "$debug" -eq 2 ] && echo … to produce the required outputs.

Wouldn't it be nice to be able to automate this, so that the script just knows whether it's being run interactively, such as ./script.sh, or perhaps over an SSH connection with ssh rem.ote.ser.ver ./script.sh or as a cron job, and then adjusts the debug level accordingly?

Well, it turns out that you can.

#!/bin/bash

[ "$TERM" = "dumb" -a ! -t 0 ] && run=cron || run=local
[ "`ps --no-headers o comm $PPID`" = "sshd" ] && run=SSH

The variable run then contains one of the three values local, SSH or cron which you can use as you wish.

For example:

debug=0
[ "$run" = "SSH" ] && debug=1
[ "$run" = "local" ] && debug=2

Credit to https://unix.stackexchange.com/questions/46789 for insight on how to do this.


Go up
Return to main index.