E 짓궂군요 받을시간은 bash 스크립트입니다 설정되었습니다 무엇입니까?

39 m 이 , 공부하고 i& 컨텐트에서 프라인스타 파일의 압축을 푼 이전에 패키지는 데비안 아카이빙할 실행하므로 스크립트입니다 변경분이 (이데브) 파일.

스크립트입니다 은 다음과 같은 코드:

#!/bin/bash
set -e
# Automatically added by dh_installinit
if [ "$1" = install ]; then
   if [ -d /usr/share/MyApplicationName ]; then
     echo "MyApplicationName is just installed"
     return 1
   fi
   rm -Rf $HOME/.config/nautilus-actions/nautilus-actions.conf
   rm -Rf $HOME/.local/share/file-manager/actions/*
fi
# End automatically added section

내 첫 대한 질의입니다 라인:

set -e

내 생각에 미삭 스크립트의 간단합니다. It 는 데비안 패키지 관리자 / unbuntu 설치 작업을 수행하여 있는지 확인합니다. 이 경우 응용 프로그램이 설치된 시스템은 그냥 내 있는지 확인합니다. 이제 막 installed&quot 미아프리카션나미 있으면, 인쇄, 메시지, 와 스크립트입니다 &quot motor1.1end ('반품하십시오 1' 로 끝나는 짓궂군요 "오류" 어울리실까?).

데비안 패키지 시스템을 설치할 경우 사용자가 요구하는 스크립트는 2 / unbuntu 내 패키지로의 deletes 디렉터리용.

아니면 내가 무언가 빠진 이거 맞지?

질문에 대한 의견 (8)
해결책

"에서 도움말에서는 세트 '.

  -e  Exit immediately if a command exits with a non-zero status.

하지만 잘못된 관행을 고려할 it& # 39 의 정도 (bash FAQ, irc 프리노드 # bash FAQ 제작자). # 39 의 권장됨 it& 사용할 수 있습니다.

trap 'do_something' ERR

'do_something' 기능을 실행할 때 오류가 발생합니다.

Http://mywiki.wooledge.org/BashFAQ/105 참조

해설 (13)

'세트 - e' 는 명령을 실행할 수 있는 경우 또는 파이프라인간의 정지점으로 스크립트입니다 오류- 원하는거요 반대, 이는 기본 셸 스크립트에서 무시하려면 오류가 있다. 이 문서를 보려면 터미널에서 세트 '유형' 도움말에서는 내장현 함장님이요

해설 (2)

[Bash 내장 - 설정 따라 '/', '수동' 의 설정 - e 에르스트 경우 즉시 종료하므로 쉘로 경우 구성된 하나의 [간단한 명령을] [파이프라인간의] [2] [3], [바뀌엇어요] [4] 또는 [복합 명령] [5] 은 비제 되돌려줍니다 상태.

기본적으로 종료하십시오 파이프라인간의 상태에 있는 경우 '는 마지막 명령의 종료 상태 파이프라인간의 피에프일' 옵션을 활성화되었는지 (it& # 39 에 기본적으로 비활성화됨).

그렇다면 pipeline& # 39 마지막 (맨 오른쪽) 의 상태를 반품하십시오 함께 종료됩니다. 제로 상태, 또는 모든 명령을 종료하십시오 경우 넌제로 명령을 성공적으로.

39 와 같은 경우, d, 뭔가 실행할 수 있는 'you& 종료하십시오 정의중 시도하시겠습니까 트랩할' (예:

trap onexit EXIT

여기서 '에서' 는 아래와 같이 사용하는 함수가 오네스트 뭔가를 종료하십시오 원하는거요 인쇄면이 간단한 스택 추적:

onexit(){ while caller $((n++)); do :; done; }

'- E' / '에르트라스' 비슷한 옵션을 좁히어 가 되는 대신 트랩할 방황케 대한 예:

trap onerr ERR

사례

제로 상태 (예:

$ true; echo $?
0

비제 상태 (예:

$ false; echo $?
1

부정 상태 (예:

$ ! false; echo $?
0
$ false || true; echo $?
0

테스트 중인 '와' 피에프일 비활성화됨:

$ bash -c 'set +o pipefail -e; true | true | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; false | false | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; true | true | false; echo success'; echo $?
1

테스트 '와' 피에프일 기술입니까 활성화됨:

$ bash -c 'set -o pipefail -e; true | false | true; echo success'; echo $?
1

[2]: https://www.gnu.org/software/bash/manual/html_node/Pipelines.html # 파이프라인 [3]: https://www.gnu.org/software/bash/manual/html_node/Simple-Commands.html # 간단한 명령 [4]: https://www.gnu.org/software/bash/manual/html_node/Lists.html # 열거합니다 [5]: https://www.gnu.org/software/bash/manual/html_node/Compound-Commands.html # 복합 명령

해설 (0)

내가 찾은 이 질문은 구글링 하면 종료하십시오 노트북이었습니다 스크립트입니다 동시에 분석할 수 있는 상태 'e' 세트 - 인해 중단되었습니다. # 39, t answer didn& 다는일은 명백하네 나타납니다. 따라서 그 답이 있다. 기본적으로 '-' e '의 명령 실행 취소됩니다 설정되었습니다 되돌려줍니다 명령의 종료 상태 코드 (예를 들어, 셸 스크립트입니다) 와 실패한 (즉, 내부 스크립트입니다 아닌 외부 스크립트입니다) .

예를 들어, 셸 스크립트입니다 있어요 'outer-test.sh':

#!/bin/sh
set -e
./inner-test.sh
exit 62;

코드의 'inner-test.sh' 입니다.

#!/bin/sh
exit 26;

달릴 땐 'outer-script.sh' 에서 종료 코드를 종료되고 명령줄이 내 외부 스크립트입니다 내부 스크립트입니다.

$ ./outer-test.sh
$ echo $?
26
해설 (0)

I believe 는 스크립트입니다 파르게 실패하게 된 것이다.

이 때, 단순히 'e' 유형 '세트 - 테스트하려면 교도관님도요 프롬프트합니다 내주었다. 이제 실행하십시오 'ls'. # 39, ll get 디렉터리입니다 you& 목록은 해당 앨범의 부클릿에서 발췌하였다. Lsd, 유형 '지금'. 이 명령은 인정되지 않는 및 오류 코드가 반환되므로 프롬프트로 해당 bash 등의 닫으십시오 ('세트 - e 로 인해').

지금 # 39, & # 39 이 맥락에서 이해할 수 있도록 script& 사용하여, 이 단순한 스크립트입니다.

#!/bin/bash 
# set -e

lsd 

ls

39, ll get 디렉토리에는 그대로 실행할 경우, you& 열거합니다 'ls' 에서 마지막 줄에. 이 경우 주석 '과' 세트 - e 로 다시 실행하십시오 전날에약혼자에게 won& # 39, t 처리 오류가 발생하면 일단 열거합니다 com/go/lrvid4005_ps_kr 디렉토리에는 bash 정지점으로 lsd '에서'.

해설 (2)

하지만 누구도 이 질문에 대한 답을 이것은 오래된 논의하십시오 'e' - '설정' 에서 사용하는 설정되었습니다 lc-fc - o 에르스트 데비안 패키지 취급료 스크립트입니다. 이 옵션은 필수 , 사용하면 이러한 스크립트에만 호스트당 데비안 정책. 이 자료는 오류 가능성을 방지하기 위해 처리되지 않은 것으로 알려졌다.

즉, 실제로는 어떤 명령을 실행할 때 어떤 조건에서 오류가 돌아갈 수 있는지 이해할 수 있으며, 이들 각 오류뿐만 처리하십니까 명시적으로.

일반 정보 컴파일러들로는 diff ' (되돌려줍니다 오류가 있을 때 차이)' 와 '그렙' (오류가 되돌려줍니다 없을 때 일치). 함께 명시성 취급료 오류를 방지할 수 있습니다.

diff this that ||
  echo "$0: there was a difference" >&2
grep cat food ||
  echo "$0: no cat in the food" >&2

(알림) 도 우리가 어떻게 잘있게나 포함하도록 현재 script& # 39 의 이름을 쓰는 표준 오류 메시지 및 표준 진단 메시지를 대신 출력입니다.)

정말 필요한 것은 아무 것도 할 수 없는 경우 또는 명시적으로 명시성 취급료 유용하다.

diff this that || true
grep cat food || :

(The use of the shell& # 39 의 op 없습니다. 명령은 약간 무명 일반적으로 볼 수 있지만, ':') 이라고 불린다.)

그냥 다시,

something || other

는 의 대표

if something; then
    : nothing
else
    other
fi

즉, 우리는 '다른' 무언가 '실패' 라고 명시적으로 경우에만 실행해야 합니다. 이 때는 긴 형식의 '만약' (',' like '동시에' 흐름 제어 및 기타 쉘로 제표를 때까지) 도 올바른 방법으로 처리하십니까 오류가 (랑하니 경우 weren& # 39, t, 쉘 스크립트를 포함하고 있는 'e' 세트 - 그렇게 할 수 없는 흐름 제어문을!)

뿐만 아니라, 그냥 이렇게 할 수 있는 'e', '세트 - 명시성 부재 처리기에서 일으킬 경우 전체 스크립트입니다 오류가 발생하여 실패할 경우, 또는 발견 즉시' 차이 ',' didn& 그렙 diff 't find a # 39 경기.

반면, 일부 명령의세 don& # 39, t, d # 39 하려는 you& 때 깔의 오류로 종료 상태. 흔히 문제가 되는 명령은 '찾기' (종료하십시오 실제로 파일을 찾을 수 있는지 여부를 반영하지 않은 상태) '와' sed (종료 상태 won& # 39, 실제로 성공적으로 수행한 명령을 받은 나열할지 스크립트입니다 입력 또는 알 수 없다). 간단한 명령을 하지 않는 것이 일부 시나리오용으로 파이프하시겠습니까 소리 없는 경우 출력:

find things | grep .
sed -e 's/o/me/' stuff | grep ^

파이프라인이 상태에 있다는 점에 유의해야 합니다 종료하십시오 마지막 명령의 종료 상태는 그 파이프라인간의. 그래서 실제로 위의 명령의세 마스킹해야 찾기 '와' 상태 '완전히' 말씀 'sed, 단 표시할지를 그렙' 드디어 성공했습니다.

(Bash) 는 물론 ',' 세트 - o 피에프일 그러나 데비안 패키지 스크립트를 Bash 기능을 사용할 수 없습니다. 정책 단단히 명령을 사용하여 POSIX 'sh' 이 스크립트, 비록 이 항상 그런 것은 아니었다.)

이 길이 별도로 제스쳐놀이처럼 아웃해야 코딩 수비 때 사용하는 경우가 많습니다. 예를 들어, 임시 파일 거쳐야 할 때도 있는 것을 볼 수 있도록 만든 것이라고 관용구 및 편리성을 출력입니다 나열할지 명령을 사용할 수 있습니다, 그렇지 않으면 직접 경우에도 성공적으로 마친 쉘로 파이프라인간의.

해설 (0)
Script 1: without setting -e
#!/bin/bash
decho "hi"
echo "hello"
This will throw error in decho and program continuous to next line

Script 2: With setting -e
#!/bin/bash
set -e
decho "hi" 
echo "hello"
# Up to decho "hi" shell will process and program exit, it will not proceed further
해설 (0)