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
.