$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