tech-userlevel archive

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

Re: shell trap vs inherited signal dispositions



    Date:        Fri, 2 May 2025 15:50:31 +0300
    From:        Valery Ushakov <uwe%stderr.spb.ru@localhost>
    Message-ID:  <aBS_l-1o8sPrLHSX%snips.stderr.spb.ru@localhost>

  | When run under nohup bash prints that SIGHUP is ignored (empty
  | string):
  |
  |   $ rm -f nohup.out; nohup bash -c 'trap -p'; cat nohup.out
  |   sending output to nohup.out
  |   trap -- '' SIGHUP
[...]
  | But sh prints that SIGHUP has the default disposition:
[...]
  | So I would expect our shell's trap -p to also print trap -- '' SIGHUP
  | in a non-interactive shell under nohup.  Do I miss something here?

It is a difference of opinion as to what trap -p is intended to report.
That is, the OS signal state, or the shell trap (condition) state.

Or perhaps it is a difference of opinion as to what the default state
of traps is intended to be.

sh by default has all traps in their default state, until a trap command
causes that to be altered (and traps can be set on conditions where the
standard does not permit the shell to alter the signal state) and trap -p
reports the state of the shell's traps, the assumption being that
the point of trap -p is so traps can be saved and restored to their
current state, should a temporary alteration be required (that is,
what a bare "trap" was originally intended to do, but fails).

In sh (bash as well I think) a signal being ignored (or even caught) does
not mean there is a trap set (or not) to achieve a similar effect.

bash is trying to equate traps with signals, which they really aren't
(aside from anything else, there's no EXIT signal, and bash has several
more like that) - signals are just the mechanism the shell uses to
implement (some) traps.

POSIX doesn't say which is intended.

kre



Home | Main Index | Thread Index | Old Index