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

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

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

이 스크립트는 -e없이 실행하십시오. 이 스크립트에서 -e는 무엇을합니까? 또한 이러한 맥락에서 $?는 무엇을합니까?

댓글

  • 이상합니다. 매뉴얼 페이지에 -e가 없습니다 (정답 주소를보고 싶습니다). $?에는 마지막 종료 코드 (위에서 생성 된 egrep 프로세스의 코드)가 포함됩니다.
  • @pst : -eset에 문서화되어 있습니다.
  • 다음을 수행하여 스크립트를 단순화 할 수 있습니다. if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
  • ' if[. 이 스크립트는 ' -e에서 작동하지 않습니다. grep ' -e에서 아무것도 찾지 못하면 스크립트가 바로 종료됩니다. -e가 없으면 ' 메시지가 거꾸로 표시됩니다. 상태 ($?) 0은 grep이 사용자를 찾았 음을 의미합니다. 참고로 이것은`grep ' ^ username : '이어야합니다 (만약 ' 이름이 더 긴 다른 사용자입니까?).
  • #/bin/bash -e#/bin/bash 1 행 및 set -e 2 행?

답변

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

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

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

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

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

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

/etc/passwd 파일에서 username를 찾습니다.

  • 찾는 경우 그러면 종료 상태 $?0와 같습니다.

  • 그렇지 않은 경우 “종료 상태가 0가 아닙니다. 여기에서 echo "doesn"t exist" 부분을 실행하고 싶을 것입니다. 코드.

안타깝게도 스크립트에 오류가 있습니다. 사용자가 존재하는 경우 코드를 실행합니다.-행을

논리를 올바르게 설정합니다.

그러나 사용자가 “없음, egrep는 오류 c를 반환합니다. ode 및 -e 옵션으로 인해 셸이 해당 줄 바로 뒤에 종료되므로 코드의 해당 부분에 도달 할 수 없습니다.

댓글

  • 또한 처음 두 줄을 if egrep "^username" /etc/passwd >/dev/null로 바꾸면 -e없이 스크립트가 올바르게 작동하도록 할 수 있습니다.
  • set가 필요하지 않습니까? :-/
  • @pst : -e가 명령 줄 인수로 bash에 제공되기 때문입니다. set 아래에 나열된 모든 옵션은 명령 줄의 bash에서도 허용됩니다. 설명서의 옵션 섹션에있는 첫 번째 문장에 유의하세요. 페이지.

답변

모든 bash 명령 줄 스위치는 man bash.

 -e Exit immediately if a pipeline (which may consist of a single simple command), a subshell command enclosed in parentheses, or one of the commands executed as part of a command list enclosed by braces (see SHELL GRAMMAR above) exits with a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command"s return value is being inverted with !. A trap on ERR, if set, is executed before the shell exits. This option applies to the shell environment and each subshell envi- ronment separately (see COMMAND EXECUTION ENVIRONMENT above), and may cause subshells to exit before executing all the commands in the subshell. 

댓글

  • Ahh. 나는 그 사람에게서 그것을 찾았지만, 파일 테스트에서 -e를 찾은 후 내가 포기한 주요 인수 아래에서 -e를 찾지 못했습니다. 좋은 발췌. 왜 set가 필요하지 않습니까? :-/

답변

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

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

종료 상태 0-의미-모든 것이 정상입니다. grep의 경우”OK, 문자열을 찾았습니다 “를 의미합니다. 종료 상태! = 0은 무언가 잘못되었음을 의미합니다. grep 1의 경우 “찾을 수 없음”, 2는 “입력을 열 수 없음”을 의미합니다 …

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다