스크립트에서 반환 값을 가져오는 데 문제가 있습니다. 나에게 문제를 일으키는 스크립트는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