スクリプトが自分自身を呼び出すことを確認する

スクリプトが自分自身を呼び出すことを確認する

たとえば、printScript.shスクリプトを実行しています。内部呼び出し元がprintScript.shであるかどうかを確認するには?再帰があるかどうかを確認するには?

答え1

この問題次のように、bashスクリプトから呼び出し元スクリプトの名前を取得する方法を示す許可された答えがあります。

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

答え2

おそらく最も簡単で信頼性の高い方法は、シェル環境変数を使用することです。これを$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ローカルです。

関連情報