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

标签 bash scripting shell redirect

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

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

最佳答案

试试这个:

ps -o stat= -p $PPID

如果结果包含“s”(小写),它要么是从命令行运行的,要么是从脚本中后台运行的。区分这两者:

ps -o stat= -p $$

如果没有背景,将包含一个“+”。

这是一个表格:

Run          $$    $PPID
CL           S+    Ss
CL&          S     Ss+
Script       S+    S+
Script&      S     S
Script(&)    S     Ss
Script&(&)   S     NULL

其中 (&) 表示子脚本是后台运行的,& 表示运行它的父脚本(这是“脚本”所指的)是后台运行的。 CL 表示命令行。 NULL 表示 ps 输出 null 并且 $PPID 为“1”。

来自 man ps:

   s    is a session leader
   +    is in the foreground process group

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

关于bash - 检查是否从 shell 或其他脚本/应用程序调用了 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4261876/

相关文章:

python - 如何搜索具有相同列值的行并在不存在时插入行?

linux - tar 创建一个空文件夹,我该如何摆脱它?

json - 如何正确字符串化 XML 以将 JSON 正文作为 CURL 命令的一部分放入

shell - 如何在模式之前和行号之后使用 sed 插入一行?

algorithm - shell脚本中关联数组的时间复杂度

excel - 如何在多个文件中查找常用单词

c - 使用 sigwait 处理 SIGQUIT

linux - Bash 脚本不继续读取文件的下一行

shell - 使用Dockerfile中的Shell脚本启动多个服务

bash - 如何查找两个列表之间的校验和匹配(但不在两个列表内)?