developer tip

bash 쉘 명령 행에 대한 매개 변수 -e의 의미는 무엇입니까?

optionbox 2020. 11. 18. 08:55
반응형

bash 쉘 명령 행에 대한 매개 변수 -e의 의미는 무엇입니까?


헤더가있는 bash 쉘 스크립트가 #!/bin/bash -e있습니다.

스크립트를 실행하면 grep명령 실행 후 중단 되지만 매개 변수를 제거 -e하면 스크립트가 정상적으로 실행될 수 있습니다. 매개 변수의 의미는 무엇입니까 -e?


-e옵션은 "파이프 라인이 0이 아닌 ( '오류') 종료 상태로 끝나는 경우 즉시 스크립트를 종료합니다"를 의미합니다. 일치하는 항목을 찾지 못한 경우 grep종료 상태를 반환 하므로 실제 "오류"가없는 경우에도 스크립트가 종료 1될 수 있습니다 -e.

당신은 유지하려는 경우 -e옵션을뿐만 아니라이 grep유효 더 일치하는 항목을 찾을 수있는 명령을, 당신은 추가 할 수 있습니다 || :받는 grep명령. 이것은 "또는 grep명령이 0이 아닌 종료 상태를 반환하면 실행 :(아무것도하지 않음)"을 의미합니다. 따라서 순 효과는 명령 을 비활성화 -e하는 것 grep입니다. 그래서:

grep PATTERN FILE... || :

: 추가 편집 위의 방법 버립니다 모든 오류 : 경우 grep반환 1이 발견 없기 때문에 무시됩니다 일치,뿐만 아니라 경우 grep수익률 2이 무시됩니다 오류가 있었고, 경우가 있기 때문에 grep경로에없는 (배쉬 반환 때문에 127), 그의를 무시됩니다. 따라서.보다는 :결과 코드를 확인하고 .NET 이외의 경우 오류를 재발행하는 명령을 사용하는 것이 좋습니다 1. 예를 들면 :

grep PATTERN FILE || (( $? == 1 ))

그러나 이것은 종료 상태를 파괴합니다. 일반적으로 실패한 명령이를 사용하여 Bash 스크립트를 종료 -e하면 스크립트는 명령의 종료 상태를 반환하지만 위의 예에서 스크립트는 1. 우리가 그것에 관심이 있다면 다음과 같이 작성하여 수정할 수 있습니다.

grep PATTERN FILE || exit_code=$?
if (( exit_code > 1 )) ; then
    exit $exit_code
fi

(첫 번째 줄 c / o dsummersl 의 의견).

이 시점에서 우리를 위해 이것을 처리 할 쉘 함수를 만드는 것이 아마도 가장 좋습니다.

function grep_no_match_ok () {
    local exit_code
    grep "$@" || exit_code=$?
    return $(( exit_code == 1 ? 0 : exit_code ))
}

( return보단 의 사용에 유의하십시오 exit. -e적절한 경우 종료를 처리 하겠습니다 .) 이렇게하면 다음과 같이 작성할 수 있습니다.

grep_no_match_ok PATTERN FILE     # won't kill script if no matches are found

사실, 이 스크립트 모든 항목에 대해이 함수를 사용하고 싶을 가능성이 높 으므로 grep실제로 함수의 이름을 지정할 수 있습니다 grep.

function grep () {
    local exit_code
    command grep "$@" || exit_code=$?
    return $(( exit_code == 1 ? 0 : exit_code ))
}

grep PATTERN FILE     # won't kill script if no matches are found

( command자체 내에서 쉘 함수를 우회하기 위해 의 사용에주의하십시오 : 함수가 grep무한히 재귀하는 대신 일반 프로그램을 호출하기를 원합니다 ).


로부터 미세 설명서 :

단일 문자 셸 명령 줄 옵션 (Set Builtin 참조) 외에도 사용할 수있는 여러 문자 옵션이 있습니다.

그리고 우리가 무슨 set을하는지 살펴보면 :

-e
단일 간단한 명령 (단순 명령 참조), 괄호로 묶인 하위 쉘 명령 (명령 그룹화 참조) 또는 다음으로 묶인 명령 목록의 일부로 실행되는 명령 중 하나로 구성 될 수있는 파이프 라인 (파이프 라인 참조)이 있으면 즉시 종료합니다. 중괄호 (명령 그룹화 참조)는 0이 아닌 상태를 반환합니다.

따라서라고 말할 때 bash -e스크립트의 명령이 실패하면 (즉, 0이 아닌 존재 상태를 반환) 전체 스크립트가 즉시 실패합니다. 따라서 grep일치하지 않기 때문에 0이 아닌 값을 반환하고 -ebash를 실행할 때 지정 하면 전체 스크립트가 종료됩니다 .

참고 URL : https://stackoverflow.com/questions/9952177/whats-the-meaning-of-the-parameter-e-for-bash-shell-command-line

반응형