2013-07-13 3 views
1

오류 발생시 정리를 위해 trap을 사용하려고합니다. 나는 다음과 같은 코드를 가지고 있지만 구문적인 문제가있는 것으로 보인다.bash의 트랩 구문 문제

#!/bin/bash 

set -e 

function handle_error { 
    umount /mnt/chroot 
    losetup -d $LOOP_DEV1 $LOOP_DEV2 
} 

trap "{ echo \"$BASH_COMMAND failed with status code $?\"; handle_error; }" ERR 

트랩 작성 방법에 문제가 있는지 확인하십시오. 오류가 발생하면 트랩이 제대로 실행되지만 아래에 또 다른 원치 않는 오류 메시지가 발생합니다.

/root/myscript.sh: line 60: } ERR with status code 0: command not found 
##line 60 is that line of code that exited with a non zero status 

어떻게 올바르게 오류 메시지를 피하기 위해 작성합니까? 또한 인수 $ LOOP_DEV1과 $ LOOP_DEV2를 메인 스크립트에서 트랩으로 보낸 다음 handle_error 함수로 보내야한다면 어떻게 될까요? 현재는 주 스크립트에서 환경 변수로 내보내집니다. 함정 예제를 검색했지만 비슷한 결과를 얻을 수 없었습니다.

편집

나는/빈/bash는에/빈/SH에서 오두막을 변경했습니다./bin/sh는 이미 bash와 심볼릭 링크가되어 있었기 때문에 나는 유니콘을 기대하지도 않았고 아무 것도 보지 못했습니다. 트랩 호 흥미로운 재귀 만드는 것을

+0

스크립트가 실제로'sh'가 아닌'bash'로 실행되면'handle_error() {'로 함수를 정의해야합니다. 'function' 키워드는'bash' 확장입니다. – chepner

+0

@chepner/bin/sh는 대부분의 경우 bash에 대한 sym 링크가 아니십니까? 적어도 그것은 내 시스템의 경우 인 것 같습니다. –

+2

Bash 구문을 사용하는 경우,'/ bin/sh'가'/ bin/bash'에 대한 심볼릭 링크 인 경우에도 shbang 줄에'#!/bin/bash'를 지정해야합니다. 그렇게하면'/ bin/sh'가'/ bin/bash '에 대한 심볼릭 링크가 아닌 시스템에서 스크립트가 실행된다면 여전히 올바르게 작동합니다. –

답변

2

, $BASH_COMMAND (및 $?)이 때 trap 명령이 실행 확대되고 있기 때문이다. 그러나 해당 시점에 $BASH_COMMAND은 트랩 명령 자체이며 $BASH_COMMAND (및 일부 인용 부호 및 세미콜론)이 텍스트로 포함됩니다. "'뿐만 아니라 피합니다 교체하는 것이

trap '{ echo "$BASH_COMMAND failed with status code $?"; handle_error; }' ERR 

참고 : 사실 명령이 트랩 화재는 흥미로운 연구가 될 때 실행,하지만 당신이 이런 식으로 할 수있는 문제를 해결하기 위해 필요는 없습니다 할 알아내는 즉각적인 매개 변수 확장을 통해 내부를 벗어나야 만합니다. " s.

+0

작동하는 것으로 보입니다. 고마워. 재귀의 결과로 실행하려고하는 명령을 파악하면 게시됩니다. –

+0

@braindead : 따옴표를주의 깊게 살펴 봐야 함에도 불구하고'trap'을 입력하고 ERR과 관련된 명령을 보는 것으로 속일 수 있습니다. handle_error가 두 번 호출되지만 두 호출 사이에서' "} ERR이 상태 코드 0"'으로 실패하여 사용자가 보는 오류 메시지가 표시됩니다. '{'와'} '는 셀 구분 문자가 아닙니다. '''가 앞뒤에 차이가 없지만 위의 ""을 움직여서 무엇이 진행되고 있는지 더 분명하게했습니다. – rici