Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > gnu.bash.bug > #16161
| From | gentoo_eshoes@tutanota.com |
|---|---|
| Newsgroups | gnu.bash.bug |
| Subject | Re: looking for consistent C-c trap behavior |
| Date | 2020-04-18 00:00 +0200 |
| Message-ID | <mailman.551.1587160875.3066.bug-bash@gnu.org> (permalink) |
| References | <M58iOBd--3-2@tutanota.com> <CAOSMAuuow0=Q7dzYyw3DnYduX79+Cqcc1jyb6q3KZK+z3ofzpg@mail.gmail.com> <M58lP4X--3-2@tutanota.com> <M599AxG--3-2@tutanota.com> |
[Multipart message — attachments visible in raw view] - view raw
Apr 17, 2020, 22:14 by gentoo_eshoes@tutanota.com:
>
>
>
> Apr 17, 2020, 22:02 by dualbus@gmail.com:
>
>> On Fri, Apr 17, 2020 at 12:59 PM gentoo_eshoes--- via Bug reports for
>> the GNU Bourne Again SHell <bug-bash@gnu.org> wrote:
>>
>>>
>>> I've noticed that if I trap SIGINT in a bash script, the behavior when encountering C-c depends on whether an external command (eg. 'sleep 100') or a builtin command (like 'read -p') was encountered.
>>>
>>> I attach an example script which requires me to press C-c twice to interrupt the builtin 'read -p' command, and it only works because I'm restoring the trap via 'trap - SIGINT' the first time.
>>>
>>> My goal is to have C-c interrupt and use that exit code (130 most likely) to exit with from script, regardless or whether or not the interrupted command in the script was an internal or external one.
>>>
>>> How to do?
>>>
Let me put some effort into it: (attached anew script, prev. was had extra 'sleep 100' which was supposed to be commented out)
To break from the builtin 'read', I have to use C-c twice: the first time I restore SIGINT trap so that the second C-c can actually make 'read' break/exit
$ ./sigintread.bash
Press C-c here...^Cinterrupted sees exit code '0'
^C
Maybe I should paste it rather than attach it, here:
#!/bin/bash
#C-c won't break the builtin read unless default SIGINT trap is restored, thus needing two C-c to exit
interrupted() {
local ec="$?"
trap - SIGINT #this restores prev. behaviour, so now another C-c will stop 'read -rp'
echo "interrupted sees exit code '$ec'"
# exit "$ec" #this is needed ONLY for when 'sleep' is used and interrupted, or else it will continue running and hit 'Normal exit', if used with 'read' then it will exit without breaking 'read' thus exit code is 0 instead of 130 (128+2 aka SIGINT==2)
}
trap interrupted SIGINT
builtin read -rp "Press C-c here..." #can use 'sleep 100' instead of this 'read...' here, for testing how the behaviour is different with an external command instead of a builtin one.
#sleep 100
#ping 127.0.0.1 #ping will ec=0 on C-c
ec="$?"
echo
echo "Normal exit sees ec=$ec"
exit "$ec"
Back to gnu.bash.bug | Previous | Next | Find similar
Re: looking for consistent C-c trap behavior gentoo_eshoes@tutanota.com - 2020-04-18 00:00 +0200
csiph-web