Bash에서 호출자 함수의 호출 방법을 얻는 방법

Bash에서 호출자 함수의 호출 방법을 얻는 방법

$caller_method아래 코드를 기반으로 함수 호출자가 일반적으로 함수를 호출했는지 여부(예: 아래 의사코드 함수에서 mytest 1서브셸 스타일을 사용) 에 대한 값을 얻을 수 있습니까 echo "(mytest 1)"?

#!/bin/bash
function mytest() {

      # THIS IS PSEUDOCODE
      if $caller_method=directly; then
         echo "THIS WAS CALLED DIRECTLY"
         # Do other stuff
      elif $caller_method=inside_a_subshell; then
         echo "THIS WAS CALLED INSIDE A SUBSHELL"
         # Do other stuff
      fi
     # END OF PSEUDOCODE
}
    
    # CALLER 
    # Calling mytest directly
    mytest 1
    # Calling mytest inside a subshell
    echo "$(mytest 1)"

예상 출력:

THIS WAS CALLED DIRECTLY
THIS WAS CALLED INSIDE A SUBSHELL

그렇다면 mytest() 함수는 이 mytest 1메소드를 사용하여 호출되는지 여부에 관계없이 정보를 이해하거나 저장할 수 있습니까 $(mytest 1)?

$(mytest 1 call_inside_a_subshell)또한 호출자 함수에서 또는 같은 추가 매개변수를 전달하고 싶지 않습니다.mytest 1 call_directly

답변1

방금 내장 변수를 사용하여 서브셸에 있는지 감지하는 방법과 관련된 이 질문을 찾았습니다.$BASHPID 서브셸에 있는지 어떻게 알 수 있나요?

따라서 코드는 다음과 같이 작성할 수 있습니다.

#!/bin/bash

function mytest()
{
    if [ "$$" -eq "$BASHPID" ]; then
        echo "THIS WAS CALLED DIRECTLY"
    else
        echo "THIS WAS CALLED INSIDE A SUBSHELL"
    fi
}

# Calling mytest directly
mytest 1
# Calling mytest inside a subshell
echo "$(mytest 1)"

답변2

나는 그것이 이루어질 수 있다고 생각한다. 이 시도:

#!/bin/bash

function mytest() {
    # THIS IS PSEUDOCODE
    if [ $ORIGINALBASHPID -eq $BASHPID ]; then
        echo "THIS WAS CALLED DIRECTLY"
        # Do other stuff
    else
        echo "THIS WAS CALLED INSIDE A SUBSHELL"
        # Do other stuff
    fi
    # END OF PSEUDOCODE
}

# CALLER
ORIGINALBASHPID=$BASHPID
# Calling mytest directly
mytest 1
# Calling mytest inside a subshell
echo "$(mytest 1)"

다음과 같이 출력됩니다.

THIS WAS CALLED DIRECTLY
THIS WAS CALLED INSIDE A SUBSHELL

관련 정보