새 셸을 시작할 때 함수 내에서 스크립트를 가져오거나 환경을 상속하는 방법을 중지하세요.

새 셸을 시작할 때 함수 내에서 스크립트를 가져오거나 환경을 상속하는 방법을 중지하세요.

명확히 하기 위해 편집됨

일반적으로 실행되어야 하는 스크립트가 있습니다. 그러나 테스트 목적으로 모든 함수와 변수의 정의를 가져오고 환경을 설정하고 필요한 경우 디렉토리를 만든 다음 중요한 부분이 시작되기 전에 돌아올 수 있기를 원합니다.기본적으로 몇 가지 검사를 수행한 후 환경을 처리하면서 환경과 상호 작용하는 셸을 가져와야 하지만 모두 통과한 경우에만 가능합니다.

코드 흐름은 다음과 같습니다.

#!/bin/bash

SOME_VAR="hey"
checker() {
  # can find fatal conditions which should exit the script
  # or stop sourcing it
  # ... do some checks
  # if all OK
  return 0

  # otherwise stop
  if [ "${0}" != "${BASH_SOURCE[0]}" ] ; then
    : #!!!! we're being sourced, what to do here??
  fi
  exit 1
}

# some more function definitions...

# do some checks to see if the current environment is supported
checker "some_fatal_condition" # need to stop sourcing here
checker "some_other_condition"

# if the script is being sourced for testing purposes, 
# and all ok up to here, stop now
return 2>/dev/null

# actual stuff follows, only if executing
# ...

내 질문은, 그것을 소싱할 때,함수 내부에서 쉘 함수를 종료하지 않고 소스 스크립트 처리를 중지하는 방법 checker?

다음과 같은 일을 추가해야합니다

checker "some_fatal_condition" || return 2>/dev/null

이 경우에는 옵션이 아닙니다(종료해야 할 수 있는 함수가 더 많고 다른 함수 등에서 호출될 수도 있음).

나는 메인 쉘 세션에서 가져오지 않고 내가 원하는 것을 달성하는 방법에 대해 몇 가지를 생각했습니다.

  • 제안 1: 내 쉘에서 중첩된 쉘을 시작하고 거기에 스크립트를 가져옵니다. 이렇게 하면 소스를 가져오는 동안 스크립트가 종료되는 경우 큰 문제가 되지 않습니다.

  • 제안 2: 스크립트 가져오기를 허용하지 말고 대신 "이것은 단지 테스트일 뿐입니다"라고 알려주는 명령줄 옵션을 전달하고 필요한 곳에서 대화형 셸을 시작합니다. 그런 다음 중요한 부분 앞에서 스크립트를 종료하십시오.

제안 2의 문제는 내가 모른다는 것입니다.정의된 모든 변수, 함수 및 셸 옵션을 상속하는 스크립트에서 대화형 셸을 시작하는 방법잠깐... 어떡하지?

답변1

exit명시적으로 오류/종료 핸들러가 아닌 이상 함수 내부에서 이 작업을 수행 하면 안 됩니다 . 바람직하게 return는 함수에서.

함수를 스크립트 본문에서 분리하는 또 다른 방법은 다음과 같이 하는 것입니다. 즉, 함수를 별도의 파일에 넣고 스크립트에 소스를 지정하는 것입니다.

답변2

set -a좋아, 테스트용 대화형 셸을 스크립트 상단에서 시작할 수 있도록 변수를 자동으로 내보내는 방법을 알아냈습니다 .

#!/bin/bash

if [ "${0}" != "${BASH_SOURCE[0]}" ] ; then
  echo "This script should not be sourced" >&2
  return 1
fi

set -a # automatically export all vars
SOME_VAR="hey"
checker() {
  # can find fatal conditions which should exit the script
  # or stop sourcing it
  # ... do some checks
  # if all OK
  return 0

  # otherwise stop
  exit 1
}

# some more function definitions...

# do some checks to see if the current environment is supported
checker "some_fatal_condition" # need to stop sourcing here
checker "some_other_condition"

# if the script is being sourced for testing purposes, stop now
if [ "${1}" == "test" ] ; then
  PS1="test> " bash
  exit $?
fi

echo "proceeding"
# actual stuff follows, only if executing
# ...

관련 정보