假设我有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}}它不受修改
答案 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)
答案 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,有更深入的解释(唯一一个对我有用的命令(linux)):
cat /proc/$PPID/comm
为您提供父pid
命令的名称如果您更喜欢带有所有选项的命令,那么:
cat /proc/$PPID/cmdline
答案 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