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


32

다음과 같은 bash 스크립트가 있습니다.

#!/bin/bash -e

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

이 스크립트는 -e 없이는 실행되지 않습니다. -e이 스크립트 의 기능 은 무엇입니까 ? 또한 $?이 맥락에서 무엇을합니까?


1
이상한. -e맨 페이지에는 없습니다 (정말 답변 주소를보고 싶습니다). $?마지막 종료 코드 ( egrep위에 생성 된 프로세스 의 종료 코드)를 포함합니다 .

2
@pst : -e는에 설명되어 set있습니다.
Greg Hewgill 2016 년

다음을 수행하여 스크립트를 단순화 할 수 있습니다.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
bollovan

2
if와 사이에 공백이 없습니다 [. 이 스크립트는 작동하지 않습니다 -e 경우 때문에, grep다음에서 아무것도 찾을 수없는 -e스크립트 바로 종료됩니다. 이 없으면 -e메시지가 거꾸로 표시됩니다. 상태 ( $?)가 0이면 grep이 사용자를 찾았 음을 의미합니다. 그건 그렇고`grep '^ username :'이어야합니다 (더 긴 이름을 가진 다른 사용자가 있다면?).
Gilles 'SO- 악한 중지'

3
#/bin/bash -e과 같은 효과가 #/bin/bash라인 # 1과 set -e라인 # 2를?
blong

답변:


34

종료 오류입니다. 더 많은 플래그

오류가 있으면 즉시 종료됩니다.

$? 과거 명령의 종료 상태입니다. Linux에서 종료 상태 0은 명령이 성공했음을 의미합니다. 다른 상태는 오류가 발생했음을 의미합니다.

egrep "^ username"/ etc / passwd> / dev / null / etc / passwd 파일에서 사용자 이름을 찾으십시오. 발견되면 종료 상태 $? 찾지 못하면 종료 상태는 0이 아닌 다른 값이되므로 "에코가 존재하지 않습니다".


또한 처음 두 줄을로 바꾸면 -e없이 스크립트가 올바르게 작동 할 수 있습니다 if egrep "^username" /etc/passwd >/dev/null.

1
set그래도 왜 필요하지 않습니까? :-/

1
@pst : -e명령 행 인수로 bash에 제공 되기 때문 입니다. 아래 나열된 모든 옵션 set은 명령 행에서 bash에 의해 허용됩니다 . 매뉴얼 페이지의 옵션 섹션에있는 첫 번째 문장을 참고 하십시오.
grawity

14

모든 bash 명령 행 스위치는에 설명되어 man bash있습니다.

      -e 파이프 라인 인 경우 즉시 종료합니다.
              단일 단순 명령)으로 둘러싸인 서브 쉘 명령
              괄호 또는 다음의 일부로 실행되는 명령 중 하나
              중괄호로 묶인 명령 목록 (SHELL GRAMMAR 참조)
              위)는 0이 아닌 상태로 종료됩니다. 껍질은하지 않습니다
              실패한 명령이 명령의 일부인 경우 종료
              while 또는 until 키워드 바로 다음에 나열
              if 또는 elif reserved에 따른 테스트의 일부
              && 또는 ||에서 실행 된 명령의 일부인 단어 명부
              마지막 && 또는 || 뒤에 나오는 명령을 제외하고
              파이프 라인의 명령이지만 마지막 명령이거나
              반환 값은!로 반전됩니다. ERR의 함정
              설정된 경우, 쉘이 종료되기 전에 실행됩니다. 이 옵션
              쉘 환경과 각 서브 쉘 환경에 적용
              별도의 론먼트 (명령 실행 환경 참조)
              위), 실행하기 전에 서브 쉘이 종료 될 수 있음
              서브 쉘의 모든 명령

2
아 나는 남자에서 그것을 찾았지만 파일 테스트에서 -e를 찾은 후 내가 포기한 주요 논쟁에서 -e를 찾지 못했습니다. 좋은 발췌. set그래도 왜 필요하지 않습니까? :-/

1

스크립트가 잘못 되었기 때문에

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는 "입력을 열 수 없음"을 의미합니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.