bashscriptingshellhttp-redirect

Check if bash script was invoked from a shell or another script/application


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?


Solution

  • 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.