简体   繁体   中英

How to run a command before a Bash script exits?

If a Bash script has set -e , and a command in the script returns an error, how can I do some cleanup before the script exits?

For example:

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

How can I ensure that /tmp/foo is removed, even if one of the commands in ... do stuff ... fails?

Here's an example of using trap:

#!/bin/bash -e

function cleanup {
  echo "Removing /tmp/foo"
  rm  -r /tmp/foo
}

trap cleanup EXIT
mkdir /tmp/foo
asdffdsa #Fails

Output:

dbrown@luxury:~ $ sh traptest
t: line 9: asdffdsa: command not found
Removing /tmp/foo
dbrown@luxury:~ $

Notice that even though the asdffdsa line failed, the cleanup still was executed.

From the bash manpage (concerning builtins):

trap [-lp] [[arg] sigspec ...]
The command arg is to be read and executed when the shell receives signal(s) sigspec.

So, as indicated in Anon.'s answer , call trap early in the script to set up the handler you desire on ERR.

From the reference for set :

-e

Exit immediately if a simple command (see section 3.2.1 Simple Commands) exits with a non-zero status, unless the command that fails is part of an until or while loop, part of an if statement, part of a && or || list, or if the command's return status is being inverted using !. A trap on ERR, if set, is executed before the shell exits.

(Emphasis mine).

sh version of devguydavid's answer .

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

ref: shellscript.sh

I don't know if it matters to you if it's before or after.

You can set a script to run immediately after closing with "trap". and then you can close the terminal.

For Example;

    trap  ./val.sh EXIT  #set command you want to run after close terminal 
    kill -9 $PPID        #kill current terminal

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM