检查是否从shell或其他脚本/应用程序调用了bash脚本

San*_*hal 11 bash shell scripting redirect

我正在编写一个bash脚本,将另一个命令的输出重定向到正确的位置.基本上,当从shell /命令行调用脚本时,我想将输出发送到STDOUT.但是,当bash脚本从其他应用程序执行时(例如另一个bash脚本,某个应用程序,或者我的Awesome窗口管理器中的awesome-prompt插件),我想将输出重定向到其他地方.

在bash中是否有任何方法可以查看脚本是如何被调用的?

Pau*_*ce. 23

试试这个:

ps -o stat= -p $PPID
Run Code Online (Sandbox Code Playgroud)

如果结果包含"s"(小写),则它可以从命令行运行,也可以从脚本中反向运行.告诉那两者:

ps -o stat= -p $$
Run Code Online (Sandbox Code Playgroud)

如果没有背景,将包含"+".

这是一张桌子:

Run          $$    $PPID
CL           S+    Ss
CL&          S     Ss+
Script       S+    S+
Script&      S     S
Script(&)    S     Ss
Script&(&)   S     NULL
Run Code Online (Sandbox Code Playgroud)

其中(&)表示子脚本是背景的,并且&表示运行它的父脚本(即"脚本"所指的)是后台的.CL表示命令行.NULL表示ps输出null并且$PPID为"1".

来自man ps:

   s    is a session leader
   +    is in the foreground process group
Run Code Online (Sandbox Code Playgroud)

应该注意的是,这个答案是基于GNU的ps,但BSD的手册页(包括OS X)表明了类似的功能.GNU ps是一种包含BSD功能的混合体.

  • 表中的"脚本"表示父脚本,而不是作为问题主题的脚本. (2认同)

thk*_*ala 8

我相信你真正想知道的是stdout是否是一个终端.如果是,那么你可以(几乎)安全地假设它是一个交互式会话.请尝试以下代码段:

if [[ -t 1 ]]; then
        echo "Terminal"
else
        echo "Not-a-terminal"
fi
Run Code Online (Sandbox Code Playgroud)

[[ -t 1 ]]上面的命令检查文件描述符1(即stdout)是否是终端.

编辑:

请注意,如果将输出传输到其他程序,这将指示非终端标准输出.在这种情况下,您可能需要一个更通用的条件,也将检查标准输入(文件描述符0):

[[ -t 0 || -t 1 ]]
Run Code Online (Sandbox Code Playgroud)