-e는 bash shebang에서 무엇을 합니까?

-e는 bash shebang에서 무엇을 합니까?

다음 내용이 포함된 bash 스크립트가 있습니다.

#!/bin/bash -e

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  echo "doesn't exist" 
fi

-e가 없으면 스크립트가 실행되지 않습니다. -e이 스크립트는 무엇을 합니까? 또한, $?이런 상황에서는 어떻게 해야 할까요?

답변1

귀하의 게시물에는 실제로 2개의 질문이 포함되어 있습니다.

  1. -e플래그는 오류 발생 시 스크립트를 종료하도록 지시합니다.더 많은 플래그

    오류가 발생하면 즉시 종료됩니다.

  2. $?마지막 명령의 종료 상태입니다 . Linux에서 종료 상태는 0명령이 성공했음을 나타냅니다. 다른 상태는 오류가 발생했음을 의미합니다.

이러한 답변을 스크립트에 적용하려면:

egrep "^username" /etc/passwd >/dev/null

username파일에서 검색됩니다 /etc/passwd.

  • 발견되면 종료 상태 $?는 와 같습니다 0.

  • 찾을 수 없는 경우 종료 상태는 다른 상태(가 아님 0)가 됩니다. 여기서 echo "doesn't exist"코드의 일부를 실행해야 합니다 .

안타깝게도스크립트에 오류가 있습니다. 코드를 실행하겠습니다.사용자가 존재하는 경우- 줄을 다음으로 변경하세요.

if [ $? -ne 0 ]

올바른 논리를 얻으려면.

하지만사용자가 존재하지 않으면 egrep오류 코드가 반환되고 이 -e옵션으로 인해 쉘은 해당 줄 바로 다음에 종료되므로 코드의 해당 부분에 도달할 수 없습니다.

답변2

모든 bash 명령줄 스위치는 에 문서화되어 있습니다 man bash.

      -e 파이프인 경우(다음을 포함할 수 있음)
              단일 단순 명령), 다음에 포함된 하위 쉘 명령
              대괄호 또는 다음의 일부로 실행되는 명령 중 하나
              중괄호로 묶인 명령 목록(SHELL GRAMMAR 참조)
              위) 0이 아닌 상태로 종료됩니다. 껍질은 그렇지 않습니다
              실패한 명령이 명령의 일부인 경우 종료합니다.
              while 또는 Until 키워드 다음에 오는 목록,
              if 또는 elif 이후의 테스트 부분이 유지됩니다.
              단어, && 또는 ||에서 실행되는 명령 목록의 일부
              마지막 && 또는 ||를 제외한 모든 명령
              파이프라인의 마지막 명령이거나 명령이 다음과 같은 경우
              반환 값은 !로 반전됩니다. ERR의 함정,
              설정된 경우 쉘이 종료되기 전에 실행됩니다. 이 옵션
              쉘 환경 및 각 서브쉘 환경에 적용
              별도의 환경(명령 실행 환경 참조)
              위) 실행 전에 서브쉘이 종료될 수 있습니다.
              서브쉘의 모든 명령.

답변3

스크립트가 올바르지 않습니다.

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  #echo "doesn't exist" # WRONG
  echo "the USER EXISTS"
fi

종료 상태 0 - 의미 - 모든 것이 정상입니다. grep의 경우 "확인, 문자열을 찾았습니다"를 의미합니다. 종료 상태 != 0은 뭔가 잘못되었음을 의미합니다. grep 1은 "찾을 수 없음"을 의미하고, 2는 "입력을 열 수 없음"을 의미합니다...

관련 정보