쉘스크립트에서 오류 종료 대신 오류를 반환합니다.

쉘스크립트에서 오류 종료 대신 오류를 반환합니다.

나는 그것이 set -e내 친구가 실수로 그만둔 것이라는 것을 알았다. 하지만 콘솔에서 함수를 실행하는 등 스크립트가 소스로 제공된다면 어떻게 될까요? 오류로 인해 콘솔이 닫히는 것을 원하지 않고 스크립트를 중지하고 오류 메시지를 표시하고 싶습니다.

$를 확인해야 합니까? 이를 가능하게 하려면 각 명령을 수동으로 실행하시겠습니까?

myScript.sh문제를 보여주는 샘플 스크립트는 다음과 같습니다 .

#!/bin/sh
set -e

copySomeStuff()
{
    source="$1"
    dest="$2"
    cp -rt "$source" "$dest"
    return 0
}

installStuff()
{
    dest="$1"
    copySomeStuff dir1 "$dest"
    copySomeStuff dir2 "$dest"
    copySomeStuff nonExistingDirectory "$dest"
}

스크립트는 다음과 같이 사용됩니다.

$ source myScript.sh
$ installStuff

그러면 콘솔이 닫힙니다. 표시된 오류가 cp누락되었습니다.

답변1

스크립트를 서브쉘로 실행하는 것이 좋습니다. 함수 정의를 읽을 수 있는 파일을 얻을 수도 있습니다. 스크립트가 errexit자체적으로 쉘 옵션을 설정하도록 합니다.

명령줄에서 이를 사용하는 경우 source"스크립트"는 실제로 대화형 셸입니다. 종료는 쉘 세션을 종료하는 것을 의미합니다. 이 문제를 해결할 수 있는 몇 가지 방법이 있을 수 있지만 errexit세션을 설정하려는 경우 가장 좋은 방법은 다음과 같습니다.

#!/bin/bash

set -o errexit

source file_with_functions
do_things_using_functions

보너스: 함수의 대화형 세션을 오염시키지 않습니다.

답변2

이를 얻으면 무시되고 호출 셸에 #!적용되므로 모든 후속 명령에 적용됩니다.set -e

서브셸을 강제로 사용할 수 있습니다.

copySomeStuff()
{
    (
        set -e
        source="$1"
        dest="$2"
        cp -r "$source" "$dest"
        return 0
    )
}

또한 안전을 위해:

  • 환경 이름과 충돌할 수 있으므로 변수 이름을 모두 대문자로 사용하지 마십시오. (지난주에 스크립트가 작동하지 않는 이유에 대한 질문이 있었는데, 스크립트에는 변수 PATH가 있었습니다)

  • 따옴표를 사용하세요.

  • 항상 -t또는 -T옵션 cp, mv, 을 사용하십시오 ln. 예를 들어

    • cp -t destination_directory source_files …
    • cp -T source_file destination_file

    -tGnu 확장 은 -T다른 일부 Unix에서는 사용할 수 없으므로 이식성을 위해 해당 -t옵션을 대체할 수 있습니다.

    • cp source_files … destination_directory/

    대체 보안 형태를 알지 못합니다.-T

관련 정보