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


119

Bash 스크립트에이 set -e있고 스크립트의 명령이 오류를 반환하는 경우 스크립트가 종료되기 전에 어떻게 정리할 수 있습니까?

예를 들면 :

#!/bin/bash
set -e
mkdir /tmp/foo
# ... do stuff ...
rm -r /tmp/foo

/tmp/foo의 명령 중 하나 ... do stuff ...가 실패 하더라도 제거 되었는지 어떻게 확인할 수 있습니까?

답변:


193

다음은 트랩 사용의 예입니다.

#!/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 행이 실패 했음에도 불구하고 정리는 여전히 실행되었습니다.


11

로부터 bash맨 (내장 명령에 관한) :

trap [-lp] [[arg] sigspec ...]
명령 arg는 쉘이 신호 sigspec을 수신 할 때 읽고 실행됩니다.

따라서 Anon.의 답변 에서 알 수 있듯이 trap스크립트의 초기에 호출 하여 ERR에서 원하는 핸들러를 설정하십시오.


help trap내장에 대한 도움말을 보려면 실행 하십시오.
Flimm

8

에 대한 참조에서 set:

-이자형

실패한 명령이 until 또는 while 루프의 일부, if 문의 일부, && 또는 || 목록 또는 명령의 반환 상태가!를 사용하여 반전되는 경우. ERR에 대한 트랩이 설정된 경우 쉘이 종료되기 전에 실행됩니다.

(강조 광산).


"-e"를 사용할 때 "-E"를 추가 할 가치가있을 수 있습니다. vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail
Max Barraclough

3

shdevguydavid의 답변 버전 .

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

심판 : shellscript.sh


POSIX나를 웃게한다. :) 링크 한 훌륭한 교육 사이트입니다.
Cometsong
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.