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

时间:2013-12-13 17:54:08

标签: bash shell

假设我有3个shell脚本:

script_1.sh

#!/bin/bash
./script_3.sh

script_2.sh

#!/bin/bash
./script_3.sh

问题在于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工具使用{时{1}}它不受修改

的影响

9 个答案:

答案 0 :(得分:49)

基于@ user3100381的回答,这里有一个更简单的命令来获得我认为应该相当便携的相同内容:

PARENT_COMMAND=$(ps -o comm= $PPID)

comm=替换为args=以获取完整的命令行(命令+参数)。仅=用于抑制标题。

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

答案 1 :(得分:14)

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

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

答案 2 :(得分:12)

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

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

Source

答案 3 :(得分:1)

这里有一些有用的文件保存在/ proc / $ PPID中

  • /proc/*some_process_id*/exe * some_process_id *
  • 下最后执行的命令的符号链接
  • /proc/*some_process_id*/cmdline包含* some_process_id *和空字节分隔参数下最后执行的命令的文件

所以稍微简化一下。

sed 's/\x0/ /g' "/proc/$PPID/cmdline"

答案 4 :(得分:1)

如果你有/proc

$(cat /proc/$PPID/comm)

答案 5 :(得分:1)

基于@ J.L.answer,有更深入的解释(唯一一个对我有用的命令()):

cat /proc/$PPID/comm

为您提供父

命令的名称

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

cat /proc/$PPID/cmdline

解释:

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

检查man proc

答案 6 :(得分:0)

您只需使用以下命令即可避免调用cut / awk / sed:

ps --no-headers -o command $PPID

如果您只想要父进程而不需要后续进程,则可以使用:

ps --no-headers -o command $PPID | cut -d' ' -f1

答案 7 :(得分:0)

声明此:

PARENT_NAME=`ps -ocomm --no-header $PPID`

因此,您将获得一个漂亮的变量$ PARENT_NAME,其中包含父母的姓名。

答案 8 :(得分:-3)

您可以将变量传递给script_3.sh以确定如何响应......

<强> script_1.sh

#!/bin/bash
./script_3.sh script1

<强> script_2.sh

#!/bin/bash
./script_3.sh script2

<强> script_3.sh

#!/bin/bash
if [ $1 == 'script1' ] ; then
  echo "we were called from script1!"
elsif [ $1 == 'script2' ] ; then
  echo "we were called from script2!"
fi