bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Simple exit trap doesn't run in newer versions of bash


From: Eduardo A . Bustamante López
Subject: Re: Simple exit trap doesn't run in newer versions of bash
Date: Fri, 25 Jan 2019 08:41:47 -0800
User-agent: Mutt/1.10.1 (2018-07-13)

On Fri, Jan 25, 2019 at 11:22:07AM -0400, Brad Spencer wrote:
(...)
> Now consider this command:
> 
> bash -c 'trap "echo WORKS" EXIT && touch x'
> 
> On newer versions of bash, it produces no output.  Substituting different
> commands in the trap or tracing it seems to indicate that the trap never
> runs.

I can reproduce the problem, my bash is: GNU bash, version 5.0.2(1)-release 
(x86_64-pc-linux-gnu)

| address@hidden:~$ rm x
| address@hidden:~$ bash -c 'trap "echo WORKS" EXIT && touch x'
| address@hidden:~$ ls -l x
| -rw-r--r-- 1 dualbus dualbus 0 Jan 25 08:26 x

> Is this a bug?  If not, can someone explain why the last command behaves
> differently?

I think it is a bug. My guess is that bash is optimizing the fork, and it's
forgetting to run the `EXIT' trap in that case, or at least that seems to be the
problem when I run this through a debugger.

| address@hidden:~/src/gnu/build-bash-devel$ gdb --args ./bash -c 'trap "echo 
WORKS" EXIT && touch x'
| GNU gdb (Debian 8.2-1) 8.2
| (...)
| (gdb) b execute_cmd.c:4537
| Breakpoint 1 at 0x515d2: file ../bash/execute_cmd.c, line 4537.
| (gdb) r
| Starting program: /home/dualbus/src/gnu/build-bash-devel/bash -c trap\ 
\"echo\ WORKS\"\ EXIT\ \&\&\ touch\ x
| 
| Breakpoint 1, execute_simple_command (simple_command=0x555555761a48, 
pipe_in=-1, pipe_out=-1, async=0, fds_to_close=0x5555557619a8) at 
../bash/execute_cmd.c:4537
| 4537  execute_from_filesystem:
| (gdb) p *simple_command->words->word
| $1 = {word = 0x555555761908 "touch", flags = 0}
| (gdb) n
| 4538    if (command_line == 0)
| (gdb)
| 4539      command_line = savestring (the_printed_command_except_trap ? 
the_printed_command_except_trap : "");
| (gdb)
| 4545    if (already_forked == 0 && (simple_command->flags & CMD_NO_FORK) && 
fifos_pending() > 0)
| (gdb)
| 4548    result = execute_disk_command (words, simple_command->redirects, 
command_line,
| (gdb)
| process 26087 is executing new program: /bin/touch
| 
| [1]+  Stopped                 gdb --args ./bash -c 'trap "echo WORKS" EXIT && 
touch x'



reply via email to

[Prev in Thread] Current Thread [Next in Thread]