스크립트가 명령 대체에서 실행됩니까?

스크립트가 명령 대체에서 실행됩니까?

POSIX 호환 쉘에서 명령 대체에서 스크립트가 실행되었는지 여부를 확인할 수 있습니까?

my-outer $(my-inner)  $(my-other-inner)

위의 예에서는 내부 명령 대체인지 ​​확인 my-inner해야 합니다 .my-other-inner

답변1

제가 이해한 것이 맞다면 그렇지 않습니다.

귀하의 질문은 다음과 같이 요약됩니다. foobar"기본" 쉘에서 실행합니까, 아니면 echo $(foobar)(명령 대체)?

foobar다음을 테스트할 수 있습니다.

  • tty(제가 tty 아래인가요?)
  • $SHLVL(껍질이 몇 뭉치 있습니까?)

필요에 따라 SHLVL사용자(쉘)가 명령을 실행한다고 가정하고 변수를 저장하고 비교할 수 있습니다.

메인 쉘 같은 것이 없고, 로그인 쉘(tty 포함), cron에서 분기된 쉘, 데몬(메일, 아파치)이 있지만 "메인" 쉘은 없기 때문에 main 주위에 따옴표를 붙였습니다.

편집하다:

지적했듯이 SLVL은 사용하기 까다로울 수 있습니다.

archemar@home> cat t2.sh
echo "$SHLVL" $1
archemar@home> . ./t2.sh $SHLVL
3 3
archemar@home> ./t2.sh $SHLVL
4 3
archemar@home> ./t2.sh $(./t2.sh)
4 4
archemar@home>

답변2

zsh, cmdsubst문자열이 존재하는지 확인하십시오 .zsh_eval_context대량으로:

$ echo "$(
  c=cmdsubst
  if (($zsh_eval_context[(Ie)$c])); then
    echo inside cmdsubst
  fi
)"
inside cmdsubst

관련 정보