Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: How to trap EXIT like in bash
- X-seq: zsh-users 20083
- From: Philippe Troin <phil@xxxxxxxx>
- To: Thorsten Kampe <thorsten@xxxxxxxxxxxxxxxx>
- Subject: Re: How to trap EXIT like in bash
- Date: Sat, 04 Apr 2015 11:20:26 -0700
- Cc: zsh-users@xxxxxxx
- In-reply-to: <mfp7s2$c1r$1@ger.gmane.org>
- List-help: <mailto:zsh-users-help@zsh.org>
- List-id: Zsh Users List <zsh-users.zsh.org>
- List-post: <mailto:zsh-users@zsh.org>
- Mailing-list: contact zsh-users-help@xxxxxxx; run by ezmlm
- References: <mfovfc$g3$1@ger.gmane.org> <1428167314.5875.2.camel@niobium.home.fifi.org> <mfp7s2$c1r$1@ger.gmane.org>
On Sat, 2015-04-04 at 19:43 +0200, Thorsten Kampe wrote:
> * Philippe Troin (Sat, 04 Apr 2015 10:08:34 -0700)
> >
> > On Sat, 2015-04-04 at 17:20 +0200, Thorsten Kampe wrote:
> > > in Bash `trap "echo trapped" EXIT` will trigger when the script
> > > terminates normally and on SIGINT, SIGTERM, and SIGHUP.
> > >
> > > In Zsh, `trap "echo trapped" EXIT` triggers only on normal exit, but
> > > `trap "echo trapped" EXIT INT` will actually trigger twice on Ctrl-C.
> > >
> > > How can I trap normal exit, Ctrl-C, SIGTERM and SIGHUP so trap
> > > function will only run once?
> >
> > I use this:
> >
> > trap "echo trapped; exit 0" EXIT INT
>
> I just tested it: Zsh is trapped once but bash twice on INT.
>
> This works:
> ```
> if [[ $shell = bash ]]
> then
> trap "echo trapped" EXIT
>
> elif [[ $shell = zsh ]]
> then
> trap "echo trapped; exit" INT
> fi
> ```
Yes, you're right. For some reason it did work for me but I can't
reproduce it. This would work everywhere:
trap "echo trapped; trap - EXIT; exit 0" EXIT INT
With bash:
% bash --version
GNU bash, version 4.2.53(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
% for i in INT TERM HUP QUIT; do bash -c 'trap "echo trapped \$?; trap - EXIT; exit 0" EXIT INT TERM HUP QUIT; sleep 5' & sleep 1; kill -$i -$!; wait; done
[2] 28903
trapped 130
[2] + done bash -c
[1] 28906
Terminated
trapped 143
[1] + done bash -c
[1] 28909
Hangup
trapped 129
[1] + done bash -c
[1] 28912
Quit
trapped 131
[1] + done bash -c
%
With zsh:
% zsh --version
zsh 5.0.7 (x86_64-redhat-linux-gnu)
% for i in INT TERM HUP QUIT; do zsh -fc 'trap "echo trapped \$?; trap - EXIT; exit 0" EXIT INT TERM HUP QUIT; sleep 5' & sleep 1; kill -$i -$!; wait; done
[2] 28936
trapped 130
[2] + done zsh -fc
[1] 28940
trapped 143
[1] + done zsh -fc
[1] 28943
trapped 129
[1] + done zsh -fc
[1] 28947
trapped 131
[1] + done zsh -fc
%
> BUT: it does not work when I extend the signals to
> ```
> elif [[ $shell = zsh ]]
> then
> trap "echo trapped; exit" INT HUP TERM
> fi
> ```
>
> Then Zsh does actually ignore the kill (TERM) signal.
That's not the behavior I'm seeing above.
Phil.
Messages sorted by:
Reverse Date,
Date,
Thread,
Author