I am writing a bash script to redirect output from another command to the proper location. Basically, when the script is invoked from a shell/commandline I want to send the output to STDOUT. But, when the bash script is executed from some other application (e.g. another bash script, some application, or in my case from the awesome-prompt plugin in my Awesome Window Manager) I want to redirect the output somewhere else.
Is there any way in bash to see how a script was invoked?
Try this:
ps -o stat= -p $PPID
If the result contains "s" (lowercase) it was either run from the command line or backgrounded from within a script. To tell those two apart:
ps -o stat= -p $$
will contain a "+" if it was not backgrounded.
Here's a table:
Run $$ $PPID
CL S+ Ss
CL& S Ss+
Script S+ S+
Script& S S
Script(&) S Ss
Script&(&) S NULL
Where (&) means the child script was backgrounded and & means the parent script (which is what "Script" refers to) that ran it was backgrounded. CL means command line. NULL means that ps output a null and that $PPID
is "1".
From man ps
:
s is a session leader
+ is in the foreground process group
It should be noted that this answer is based on GNU ps
, but the man pages for BSD (including OS X) indicate similar functionality. And GNU ps
is a hybrid that includes BSD functionality, among others.