[bash] Bash 스크립트가 종료되기 전에 명령을 실행하는 방법은 무엇입니까?

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에 대한 트랩이 설정된 경우 쉘이 종료되기 전에 실행됩니다.

(강조 광산).


답변

shdevguydavid의 답변 버전 .

#!/bin/sh
set -e
cleanup() {
  echo "Removing /tmp/foo"
  rm  -r /tmp/foo
}
trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

심판 : shellscript.sh


답변