From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3940 invoked by alias); 4 Apr 2015 18:20:31 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: X-Seq: 20083 Received: (qmail 17725 invoked from network); 4 Apr 2015 18:20:28 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_PASS autolearn=ham version=3.3.2 Message-ID: <1428171626.27718.8.camel@ceramic.home.fifi.org> Subject: Re: How to trap EXIT like in bash From: Philippe Troin To: Thorsten Kampe Cc: zsh-users@zsh.org Date: Sat, 04 Apr 2015 11:20:26 -0700 In-Reply-To: References: <1428167314.5875.2.camel@niobium.home.fifi.org> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.10.4 (3.10.4-4.fc20) Mime-Version: 1.0 Content-Transfer-Encoding: 7bit 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 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.