스크립트의 권한 오류를 올바르게 처리합니다.

스크립트의 권한 오류를 올바르게 처리합니다.

모든 모듈을 설명하는 JSON 파일을 기반으로 여러 모듈을 설치하는 스크립트가 있습니다.

각 모듈을 반복하면서 설치 스크립트를 호출합니다.

# Create install log destination
install_log=install_log/`date -Iseconds | awk -F '+' '{print $1}'`".log"
echo -e "To monitor installation:\ntail -f `pwd`/$install_log"
# Install
./install > $install_log                # <- This file sometimes does not have the x bit
if [ $? -eq 1 ]; then # Check install exit code
    echo -e "\n"
    cat $install_log | tail -n 35
    echo -e "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n~~~ Install of module $module_name failed ~~~\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n"
    exit 1;
fi

install스크립트에 x 비트가 없으면 권한 오류 메시지가 표시됩니다 . 그러나 $?오류 조건은 테스트에서 발견되지 않으며 스크립트는 계속됩니다.

이런 일이 발생하면 어떻게 스크립트를 중지하나요?

답변1

리터럴 솔루션

바꾸다

./install > $install_log # <- This line sometimes does not have the x bit
if [ $? -eq 1 ]; then # Check install exit code
    # ...
    exit 1;
fi

당신은 할 수 있습니다:

  1. 종료 상태 0이 성공을 나타내는 일반적인 규칙을 활용하고,if조건부 구조그리고!예약어:
if ! ./install > "$install_log"; then
    # ...
    exit 1
fi

정확한 오류 코드인지는 중요하지 않지만 스크립트 실행 시도의 일반적인 성공 또는 실패만 알 수 있습니다.

  1. 그렇지 않으면 다른 사람들이 의견에서 제안한 것처럼 변수의 내용을 저장 $?한 다음 가능한 모든 방법으로 사용할 수 있습니다.
./install > "$install_log"
exit_code=$?
if [ $exit_code -eq 126 ]; then
    # ...
    exit 1
fi

다양한 방법

다만, 질문 자체에 대한 접근 방식을 수정해야 한다고 생각합니다. 설치 스크립트의 맥락에서는 설치를 성공적으로 수행하는 것이 더 유리할 수 있습니다. 이는 여러 가지 방법으로 달성할 수 있으며, 특히 다음과 같습니다.

  1. Prepending을 통해 chmod +x install파일의 실행 비트를 설정합니다.설치하다:
chmod +x install
if ! ./install > "$install_log"; then
    # ...
    exit 1
fi
  1. 스크립트를 전달하여. /설치하다사용자 셸에 대한 인수로:
if ! "${SHELL:-/bin/bash}" ./install > "$install_log"; then
    # ...
    exit 1
fi

또는 직접 필수/예상 쉘:

if ! bash ./install > "$install_log"; then
    # ...
    exit 1
fi

관련 정보