호출자의 터미널을 종료하지 않고 종료 코드를 반환하시겠습니까?

호출자의 터미널을 종료하지 않고 종료 코드를 반환하시겠습니까?

스크립트에서 반환 값을 가져오는 데 문제가 있습니다. 나에게 문제를 일으키는 스크립트는second.sh다음과 같은. 그러나 다음과 같은 스크립트와의 상호 작용이 있습니다.first.sh, 그리고 이 상호 작용이 문제의 원인인 것 같습니다.

첫 번째 스크립트는 테스트 스크립트이며 두 번째 스크립트를 구동합니다. 크로스 컴파일 환경을 설정하려면 두 번째 스크립트가 필요합니다(따라서 주요 지점의 이유). 그런 다음 첫 번째 스크립트 호출make등 다양한 변수가 설정됩니다.CXX그리고CXXFLAGS.

# first.sh

. ./second.sh arg1
if [ "$?" -eq "0" ]; then
    make
    ...
fi

. ./second.sh arg2
if [ "$?" -eq "0" ]; then
    make
    ...
fi

. ./second.sh arg3
if [ "$?" -eq "0" ]; then
    make
    ...
fi

두 번째 스크립트는 일반적으로 사용자가 독립적으로 실행하며 플랫폼, 아키텍처 및 기타 기타 기능을 감지하기 때문에 매우 복잡합니다. 등 다양한 변수를 설정합니다.CXX그리고CXXFLAGS사용되었습니다make첫 번째 스크립트에서.

# second.sh
...

# if success, return 0
exit 0
...

# if failure, return non-0
exit 1

내가 겪고 있는 문제는 전화하는 것입니다.exit존재하다second.sh터미널을 죽여라.first.sh그 궤도에서 완전히 멈췄습니다. 사용자가 혼자 실행할 때도 비슷한 문제가 발생합니다.

두 번째 스크립트를 다음과 같이 변경하려고 하면:

# second.sh
...

# if success, return 0
return 0

# else for failure, return non-0
return 1

그런 다음first.sh보다,second.sh항상 실패하더라도return 0.

터미널을 종료하지 않는 Bash 아래에 반환 코드를 어떻게 추가할 수 있나요?


지금까지 나는 달려왔다.아니요첫 번째는 스크립트를 테스트하므로 두 번째 스크립트는 성공/실패를 반환할 필요가 없습니다. 하지만 테스트를 자동화하려고 하므로 반환 코드를 얻을 수 있어야 합니다.

답변1

이상적이지 않을 수 있는 한 가지 접근 방식은 do 입니다 alias exit=return. 그러면 second.sh종료 do 스크립트가 지정된 코드와 함께 반환됩니다. 이것은 확실히 이와 같은 함수의 중첩을 차단하지는 않지만 exit최상위 exit호출에서는 작동합니다.

결국 이 작업을 수행해야 할 수도 있습니다 unalias exit.

답변2

문제의 핵심은 단순히 스크립트를 실행하는 것( 또는 ) .이 아니라 스크립트를 얻는다는 것입니다( ) ../script2.sh/bin/bash script2.sh

꼭 필요한 경우 source서브셸에서 수행하세요.(. ./myscript2.sh args)

실행할 수 있다면대개스크립트를 변수에 저장할 수 있으며 종료 코드는 각 실행 후에 자동으로 업데이트됩니다 $?.

./myscript2.sh arg1
FirstExitCode=$?
./myscript2.sh arg2
SecondExitCode=$?
 ...

소스에 대해 자세히 알아보기help .

답변3

second.sh소싱에 대한 Hasta의 답변에 따르면 터미널을 종료하지 않고 상태를 반환하는 데 필요한 것 같습니다 .

#!/usr/bin/env bash
...

# if success, return 0
[ "$0" = "$BASH_SOURCE" ] && exit 0 || return 0

# else for failure, return non-0
[ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1

관련 정보