检查脚本是否调用自身

检查脚本是否调用自身

举例来说,我正在运行脚本 printScript.sh 。如何检查内部调用者是否是 printScript.sh ?以便检查我们是否有递归?

答案1

这个问题有一个可接受的答案,显示如何在 bash 脚本中获取调用者脚本的名称,如下所示:

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

答案2

最简单、最可靠的方法可能是使用 shell 环境变量。我们将用作$MY_COOL_SCRIPT_REC专用于我们的脚本的变量名称。

#!/bin/bash

# test indrect command calling, can be removed afterwards
PARENT_COMMAND=$(ps -o comm= $PPID)
echo parent is $PARENT_COMMAND

# check recursion
if [ -z ${MY_COOL_SCRIPT_REC+x} ]; then
  echo no recursion
else
  echo in recursion, exiting...
  exit  # stop if in recursion
fi
# set an env variable local to this shell
export MY_COOL_SCRIPT_REC=1

# run again in another disowned shell
nohup ./test.sh &

带输出

$ ./test.sh
parent is bash
no recursion
$ nohup: appending output to 'nohup.out'

# content of 'nohup.out'
parent is systemd
in recursion, exiting...

作为奖励,它可以很容易地用于限制递归深度

#!/bin/bash

PARENT_COMMAND=$(ps -o comm= $PPID)
echo parent is $PARENT_COMMAND

# set env var if not exists
export MY_COOL_SCRIPT_REC="${MY_COOL_SCRIPT_REC:-0}"
# check recursion
if [ "${MY_COOL_SCRIPT_REC}" -le "3" ]; then
  echo recursion depth ${MY_COOL_SCRIPT_REC}
else
  echo exiting...
  exit  # stop
fi

# increment depth counter
export MY_COOL_SCRIPT_REC=$(($MY_COOL_SCRIPT_REC+1))

# run again in another shell
nohup ./test.sh &

带输出

$ ./test.sh
parent is bash
recursion depth 0
$ nohup: appending output to 'nohup.out'

# content of 'nohup.out' (the rest of outputs are all not displayed in same shell)
parent is systemd    
recursion depth 1    
parent is systemd    
recursion depth 2    
parent is systemd    
recursion depth 3    
parent is systemd    
exiting...  

的用途nohup是测试脚本是否有效,即使脚本被间接调用。该变量$MY_COOL_SCRIPT_REC对于./test.sh仅由脚本生成的进程也是本地的。

相关内容