Bash 스크립트에이 set -e
있고 스크립트의 명령이 오류를 반환하는 경우 스크립트가 종료되기 전에 어떻게 정리할 수 있습니까?
예를 들면 :
#!/bin/bash
set -e
mkdir /tmp/foo
# ... do stuff ...
rm -r /tmp/foo
/tmp/foo
의 명령 중 하나 ... do stuff ...
가 실패 하더라도 제거 되었는지 어떻게 확인할 수 있습니까?
답변
다음은 트랩 사용의 예입니다.
#!/bin/bash -e
function cleanup {
echo "Removing /tmp/foo"
rm -r /tmp/foo
}
trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails
산출:
dbrown@luxury:~ $ sh traptest
t: line 9: asdffdsa: command not found
Removing /tmp/foo
dbrown@luxury:~ $
asdffdsa 행이 실패 했음에도 불구하고 정리는 여전히 실행되었습니다.
답변
로부터 bash
맨 (내장 명령에 관한) :
trap [-lp] [[arg] sigspec …]
명령 arg는 쉘이 신호 sigspec을 수신 할 때 읽고 실행됩니다.
따라서 Anon.의 답변 에서 알 수 있듯이 trap
스크립트의 초기에 호출 하여 ERR에서 원하는 핸들러를 설정하십시오.
답변
에 대한 참조에서 set
:
-이자형
실패한 명령이 until 또는 while 루프의 일부, if 문의 일부, && 또는 || 목록 또는 명령의 반환 상태가!를 사용하여 반전되는 경우. ERR에 대한 트랩이 설정된 경우 쉘이 종료되기 전에 실행됩니다.
(강조 광산).
답변
sh
devguydavid의 답변 버전 .
#!/bin/sh
set -e
cleanup() {
echo "Removing /tmp/foo"
rm -r /tmp/foo
}
trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails
심판 : shellscript.sh