if 문과 함수 호출을 사용하여 빌드 스크립트 작성

if 문과 함수 호출을 사용하여 빌드 스크립트 작성

내 빌드/배포 스크립트가 예상대로 작동하지 않습니다. 복제 또는 빌드가 실패하더라도 계속 진행되며 다시 시작이 호출됩니다. 0을 반환하기 때문인 것 같은데, 내부 명령에서 결과를 반환하고 싶은데, "clone"에서는 복제가 성공한 경우에만 복제된 폴더로 이동하고 싶은데 어떻게 작성해야 할까요? 이 스크립트를 어떻게 개선하시겠습니까?

function clone {
    git clone /volume1/repos/project.git
    cd project
    return 0
}

function build {
    docker build -t project .
    return 0
}

function cleanup {
    ...
}

function restart {
    ...
    docker run ...
}

trap cleanup EXIT

if clone && build; then
    restart
    exit 0
else
    echo Failed...
    exit 1
fi

답변1

예, 지적하신 대로 함수는 항상 a를 반환하므로 0항상 성공을 반환합니다. 무슨 일이 있어도. 가장 간단한 해결책은 함수가 아무것도 반환하지 않도록 하는 것입니다.

function clone {
    git clone /volume1/repos/project.git
    cd project
}

function build {
    docker build -t project .
}

man bash그런 다음 마지막 명령 실행(에서 ) 의 종료 상태를 반환합니다 .

실행될 때 함수의 종료 상태는 함수 본문 내에서 실행된 마지막 명령의 종료 상태입니다.

물론 clone함수의 마지막 명령은 이므로 실패했지만 성공하더라도 함수는 여전히 성공을 반환한다는 cd의미 입니다. 이를 방지하려면 git 명령의 종료 상태를 변수에 저장하고 함수가 해당 변수를 반환하도록 할 수 있습니다.git clonecd project

function clone {
    git clone /volume1/repos/project.git
    out=$?
    cd project
    return $out
}

아니면 더 나을 수도 있습니다.

function clone {
    git clone /volume1/repos/project.git && cd project
}

명령을 결합하여 명령 중 하나라도 실패하면 함수는 실패를 반환합니다.

답변2

함수를 다음과 같이 수정하세요.

function clone {
    if git clone /volume1/repos/project.git; then
            cd project
            return 0
    else
            return 1
    fi
}

function build {
    docker build -t project .
}

이렇게 하면 해당 명령이 실패하면 함수가 올바르게 종료됩니다. 이 함수는 docker 명령의 종료 상태만 반환하므로 명시적으로 아무것도 반환할 필요가 없습니다 build. 하지만 더 많은 명령을 추가하는 경우 이 함수와 유사하게 설정해야 할 수도 있습니다 clone.

관련 정보