bash - shell - 在bash脚本中,获取调用程序脚本的名称

111 5

假设我有3个shell脚本:

script_1.sh


#!/bin/bash


./script_3.sh



script_2.sh


#!/bin/bash


./script_3.sh



问题在于,在script_3.sh中,我想知道调用者脚本的名称。

这样我就可以对每个调用做出不同的回应

下面是一个有预期输出的例子输入

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

有没有可能,如果可能的话怎么做?

时间: 原作者:

138 3


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



args=替换comm=以获得完整的命令行(命令+参数),仅使用=来抑制标题。

原作者:
146 5

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


#!/bin/bash


PARENT_COMMAND=$(ps $PPID | tail -n 1 | awk"{print $5}")



原作者:
124 1

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

在这种情况下使用bash caller


$ cat h.sh 


#! /bin/bash 


function warn_me() { 


 echo"$@" 


 caller 


} 


$ cat g.sh 


#!/bin/bash 


source h.sh 


warn_me"Error: You didn't do something" 


$ . g.sh 


Error: You didn't do something 3 


g.sh


$



原作者:
50 5


cat /proc/$PPID/comm



提供父对象的命令名pid

如果你喜欢所有选项的命令,那么:


cat /proc/$PPID/cmdline



说明:

  • $PPID是由shell定义的,它是父进程的pid
  • /proc/中,你有一些带有每个进程( )的pid的,然后,如果你cat/proc/$PPID/comm,就回显PID的命令名,

查看man proc

原作者:
83 1

你可以简单地使用下面的命令来避免调用cut/awk/sed:


ps --no-headers -o command $PPID



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


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



原作者:
68 2

你可以传递一个变量到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



原作者:
...