在bash脚本中获取调用者脚本的名称

a14*_*14m 37 bash shell

假设我有3个shell脚本:

script_1.sh

#!/bin/bash
./script_3.sh
Run Code Online (Sandbox Code Playgroud)

script_2.sh

#!/bin/bash
./script_3.sh
Run Code Online (Sandbox Code Playgroud)

问题是script_3.sh我想知道调用者脚本的名称.

所以我可以对我支持的每个来电者做出不同的反应

请不要假设我问的是每次无论谁是来电者,$0原因$0都会回响script_3

这是一个具有预期输出的示例输入

  • ./script_1.sh 应该回应 script_1

  • ./script_2.sh 应该回应 script_2

  • ./script_3.sh应该回声user_name or root or anything to distinguish between the 3 cases

那可能吗?如果可能的话,怎么办呢?

这将被添加到一个rm修改过的脚本中...所以当我调用rm它做某事时,git或何时或任何其他CLI工具使用rm它不受修改的影响

Tho*_*est 55

基于@ user3100381的答案,这里有一个更简单的命令来获得相同的东西,我认为它应该是相当便携的:

PARENT_COMMAND=$(ps -o comm= $PPID)
Run Code Online (Sandbox Code Playgroud)

更换comm=args=得到完整的命令行(命令+参数).该=单独用来抑制头.

请参阅:http://pubs.opengroup.org/onlinepubs/009604499/utilities/ps.html

  • Cygwin的`ps`不支持`-o`选项. (5认同)
  • 如果父名称长度超过 15 个字符,它将被截断为 15 个字符......(在 RHEL8 上测试)。 (2认同)

小智 16

$ PPID变量保存父进程ID.所以你可以解析ps的输出来获取命令.

#!/bin/bash
PARENT_COMMAND=$(ps $PPID | tail -n 1 | awk "{print \$5}")
Run Code Online (Sandbox Code Playgroud)

  • 这打印`/ bin/bash` (2认同)
  • @artmees 尝试使用 `awk "{print \$6}"` (2认同)

Kas*_*yap 14

如果您正在进行source而不是调用/执行脚本,则没有新的进程分叉,因此解决方案ps将无法可靠地运行.

caller在这种情况下使用内置的bash .

资源


Gil*_*not 6

基于@JLanswer,有更深入的解释,适用于

cat /proc/$PPID/comm
Run Code Online (Sandbox Code Playgroud)

的命令名称

如果您更喜欢带有所有选项的命令,那么:

cat /proc/$PPID/cmdline
Run Code Online (Sandbox Code Playgroud)

解释:

  • $PPID由shell定义,它是父进程的
  • 在 中,您有一些带有每个进程(/proc/的目录。然后,如果您,则回显 PID 的命令名称cat /proc/$PPID/comm

检查人进程