스크립트가 자신을 호출하는지 확인

스크립트가 자신을 호출하는지 확인

예를 들어 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로컬 입니다.

관련 정보