현재 함수가 명령 대체를 통해 호출되었는지 확인할 수 있나요?

현재 함수가 명령 대체를 통해 호출되었는지 확인할 수 있나요?
foo() {
  if [[ something ]]; then
    echo "The foo function was called directly."
  else
    echo "The foo function was invoked via command substitution."
  fi
}

foo에게 직접 전화하세요:

foo

foo 함수가 직접 호출됩니다.

명령 대체를 통해 foo를 호출합니다.

a=$(foo) || exit 1
echo "${a}"

foo 함수는 명령 대체를 통해 호출됩니다.

이를 수행할 수 있는 방법이 있습니까?

답변1

나는 당신이 사용할 수 있는 한 가지 테스트가 다음과 같다고 생각합니다.

if [[ $BASHPID -eq $$ ]]; then
    echo was called directly
else
    echo was called in a subshell
fi

특수 값 $$은 스크립트를 실행하는 셸의 프로세스 ID입니다. 이는 서브쉘에서는 변경되지 않습니다(명령 대체도 그 중 하나입니다).

특수 값은 $BASHPID현재 코드를 실행하는 셸의 프로세스 ID가 됩니다. 이 값회의서브셸 내에서 변경합니다.

따라서 서로 다른 경우 하위 쉘에서 함수가 호출됩니다. 내가 아는 한, 이 하위 쉘이 명령 대체인지 ​​아니면 다른 하위 쉘인지 알 방법이 없습니다.

당신은 또한 사용할 수 있습니다

if [[ $BASH_SUBSHELL -eq 0 ]]; then
    echo was called directly
else
    echo was called in a subshell
fi

표시된 코드와 동일한 효과를 얻으려면.

이 변수는 중첩된 하위 쉘의 각 추가 수준에 대해 0부터 증가합니다 BASH_SUBSHELL.

관련 정보