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이 아닌 값을 반환하고 -e
bash를 실행할 때 지정 하면 전체 스크립트가 종료됩니다 .
'developer tip' 카테고리의 다른 글
float가 정수인지 확인 (0) | 2020.11.18 |
---|---|
벡터 / 행렬 끝까지 우아한 인덱싱 (0) | 2020.11.18 |
R % in % 연산자 (0) | 2020.11.18 |
Instagram API : 모든 사용자 미디어를 얻는 방법? (0) | 2020.11.18 |
내가 만든 .clj Clojure 파일을 어떻게 실행할 수 있습니까? (0) | 2020.11.17 |