주 스크립트는 보조 스크립트를 호출하고, 보조 스크립트는 C 프로그램을 호출합니다. C 프로그램의 반환 값을 얻는 방법을 모르겠습니다.

주 스크립트는 보조 스크립트를 호출하고, 보조 스크립트는 C 프로그램을 호출합니다. C 프로그램의 반환 값을 얻는 방법을 모르겠습니다.

다음과 같은 보조 스크립트를 호출하는 기본 스크립트가 있습니다.

 bash -ex $SOME_DIR/some_tester.sh

그런 다음 도우미 스크립트는 다음과 같이 C 프로그램을 호출합니다.

./some_tester_in_C
echo $?
.
.
.other functions called

문제는 우선 C 프로그램에서 반환 값을 얻을 수 없다는 것입니다. 두 번째 문제는 내 C 프로그램이 끝난 후 아무것도 실행되지 않고 "다른 기능"도 실행되지 않는다는 것입니다.

중요한 사실은 C 프로그램이 직렬 포트와 상호 작용하고 콘텐츠를 터미널에 인쇄한다는 것입니다. 외부 장치와의 통신이 완료되면 계속하려면 도우미 스크립트에서 캡처해야 하는 값이 반환됩니다.

그런데 메인 스크립트를 사용하지 않고 터미널에서 헬퍼 스크립트를 직접 호출하면 잘 동작하고 C 프로그램에서 반환 값을 받아 나머지 코드가 실행됩니다.

다른 스크립트를 호출한 후 간단한 C 프로그램을 호출하는 간단한 스크립트를 작성하여 문제를 재현해 보았는데 문제가 재현되었습니다.

set +x여기저기서 그것이 문제일지도 모른다고 생각하는 몇몇 사람들을 보았지만 나는 그렇게 생각하지 않습니다 . 어쩌면 $?다른 것이되어야 한다고 생각 했습니까 ? 하지만 저는 Linux 스크립팅에 익숙하지 않습니다. 몇 가지 통찰력이 도움이 될 것입니다.

답변1

실행 도우미 스크립트를 사용하고 있으므로 스크립트에서 셸 옵션을 설정 bash -e합니다 . errexit간단한 명령(예: C 명령)이 0이 아닌 종료 상태로 종료되는 경우 이 셸 옵션을 사용하면 스크립트가 종료됩니다.

C 프로그램의 종료 상태를 캡처하려면 다음을 확인하십시오.아니요도우미 스크립트를 시작하거나 AND/OR 목록의 일부로 프로그램을 실행할 때 사용합니다. 이렇게 하면 -e설정되어 프로그램이 0이 아닌 종료 상태로 종료되더라도 스크립트가 종료되는 것을 방지할 수 있습니다.errexit

status=0
./some_tester_in_C || status=$?

printf 'Exit status = %s\n' "$status"

관련 정보