Bash 스크립트 상단의 eu
다음은 무엇을 의미합니까?#!/bin/bash -eu
일반적으로 나는 이것으로 bash 스크립트를 시작합니다.해시뱅/시방:
#!/bin/bash
그런데 방금 누군가를 만났어요
#!/bin/bash -eu
왜 거기에 하나가 있는지 모르겠습니다 -eu
. 이 man bash
페이지를 읽는 것은 나에게 도움이 되지 않는 것 같지만, 아마도 내가 뭔가를 간과하고 있는 것 같습니다.
반복하지 않음:
이것은 중복이 아닙니다"set -eu" 사용 시 EXIT 및 ERR 트랩의 올바른 동작.
이 질문 아래 댓글에 @ilkkachu를 인용하세요., 이 문제를 직접 해결하십시오.
... -e 및 -u가 트랩이나 기타 항목을 처리하는 방법은 해당 옵션 및 기타 단일 문자 옵션이 명령줄에 제공되는 방식과 전혀 관련이 없습니다.
나는 이것에 동의합니다. 이것들은 서로 다른 동기를 지닌 서로 다른 질문과 답변입니다. 이 질문은 너무 달라서 제가 제 질문에 대한 답을 이해하려고 할 때 제목이나 설명을 보고 클릭할 생각조차 하지 않을 정도이고, 답도 매우 다릅니다.
답변1
-e
그들은 와 -u
같은 옵션입니다내장set
. 또한 쉘 명령줄에 제공하거나 hashbang 줄의 명령줄 인수로 제공할 수도 있습니다. (그러나 예를 들어 질문에 유의하십시오.Shebang의 여러 매개변수)
온라인 매뉴얼에는 다음과 같이 나와 있습니다."배쉬에게 전화해", 저것
set 내장 함수와 함께 사용되는 모든 단일 문자 옵션은 쉘 호출 시 옵션으로 사용 가능합니다.
단일 문자 옵션은 온라인 설명서( )의 호출 요약에도 명시적으로 나열되어 있지만 bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o option] ...
맨페이지에는 나열되어 있지 않습니다.
set -u
설정되지 않은 매개변수 확장을 오류로 처리하도록 쉘에 지시합니다. 이는 변수 이름 등의 오타를 잡는 데 도움이 됩니다.
set -e
명령이 오류와 함께 종료되면(종료 값이 달리 테스트되지 않는 한) 쉘에 종료하도록 지시합니다. 어떤 경우에는 이를 사용하여 각 명령의 상태를 명시적으로 테스트하지 않고 오류 발생 시 스크립트를 중단할 수 있습니다.
답변2
man bash
내장 명령에 설명된 대로 Bash 스크립트에 대한 옵션입니다 .set
바로 처음에 man bash
:
옵션
set 내장 명령(-o 포함) 설명에 문서화된 모든 단일 문자 쉘 옵션은 쉘을 호출할 때 옵션으로 사용할 수 있습니다.
이제는 set
별도의 명령어가 아닌 쉘 내장 명령어입니다. 그렇기 때문에 맨페이지를 찾을 수 없습니다 man set
. 대신 bash 매뉴얼에서 해당 섹션을 찾을 수 있습니다 SHELL BUILTIN COMMANDS
. set
다음 위치에서 찾을 수 있는 내장 기능이 있습니다 .
-이자형 파이프(단일 단순 명령으로 구성될 수 있음), 목록 또는 복합 명령(위의 SHELL GRAMMAR 참조)이 0이 아닌 상태로 종료되면 즉시 종료하십시오. (...)
-유 설정되지 않은 변수 및 매개변수(특수 매개변수 "@" 및 "*")는 매개변수 확장 수행 시 오류로 처리됩니다. 설정되지 않은 변수나 인수에 대해 확장을 시도하면 쉘은 오류 메시지를 인쇄하고 대화형이 아닌 경우 0이 아닌 상태로 종료됩니다.
따라서 아래 예에서 이 플래그는 선언되지 않았기 -u
때문에 첫 번째 에코에서 스크립트가 종료되도록 합니다 . notDeclared
마찬가지로 grep
해당 플래그가 존재하지 않기 -e
때문에 종료 nonExistentFile
되고 grep(간단한 명령)은 오류(0이 아닌) 상태로 종료됩니다.
#!/bin/bash -ue
echo "$notDeclared"
grep something nonExistentFile
echo "I am never going to be echoed..."
grep에서 종료되는 것을 보려면 제거하거나 맨 위로 -u
이동하십시오 grep
.
참고 grep
: grep
파일에서 패턴을 찾을 수 없으면 0이 아닌 상태로 종료합니다. 따라서 위의 예에서 nonExistentFile
문자열 없이 무언가를 생성하면 1(0이 아님)으로 종료되므로 해당 플래그로 인해 실행이 종료됩니다. 파일에서 표현식을 찾지 못하는 것은 실제로 "오류"가 아니기 때문에 이는 놀라운 일이 될 수 있습니다.something
grep
-e