[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: Re: [PATCH] ash: improve trap and jobs builtins in child shells
From: Denys Vlasenko <vda.linux () googlemail ! com>
Date: 2023-03-31 13:53:53
Message-ID: CAK1hOcP_ryrVuB6nx85SfmQmH=K8dQBe+FVuaUTeGF7SUjD2MA () mail ! gmail ! com
[Download RAW message or body]
Applied, thank you.
On Thu, Mar 30, 2023 at 12:05 PM Ron Yorston <rmy@pobox.com> wrote:
>
> The trap and jobs builtins can be used to report information about
> traps and jobs. This works when they're called from the current
> shell but in a child shell the required information is usually
> cleared. Special hacks allow:
>
> - trap to work with command substitution;
> - jobs to work with command substitution or in a pipeline.
>
> Neither works with process substitution.
>
> - Relax the test for the trap hack so it also supports pipelines.
>
> - Pass the command to be evaluated to forkshell() in evalbackcmd()
> so trap and jobs both work with process substitution.
>
> function old new delta
> forkchild 629 640 +11
> argstr 1502 1496 -6
> ------------------------------------------------------------------------------
> (add/remove: 0/0 grow/shrink: 1/1 up/down: 11/-6) Total: 5 bytes
>
> Signed-off-by: Ron Yorston <rmy@pobox.com>
> ---
> shell/ash.c | 13 +++++++------
> shell/ash_test/ash-signals/usage.right | 12 ++++++++++++
> shell/ash_test/ash-signals/usage.tests | 12 ++++++++++++
> 3 files changed, 31 insertions(+), 6 deletions(-)
>
> diff --git a/shell/ash.c b/shell/ash.c
> index 559566b58..40b921be1 100644
> --- a/shell/ash.c
> +++ b/shell/ash.c
> @@ -5190,8 +5190,7 @@ forkchild(struct job *jp, union node *n, int mode)
>
> closescript();
>
> - if (mode == FORK_NOJOB /* is it `xxx` ? */
> - && n && n->type == NCMD /* is it single cmd? */
> + if (n && n->type == NCMD /* is it single cmd? */
> /* && n->ncmd.args->type == NARG - always true? */
> && n->ncmd.args && strcmp(n->ncmd.args->narg.text, "trap") == 0
> && n->ncmd.args->narg.next == NULL /* "trap" with no arguments */
> @@ -5285,10 +5284,12 @@ forkchild(struct job *jp, union node *n, int mode)
> ) {
> TRACE(("Job hack\n"));
> /* "jobs": we do not want to clear job list for it,
> - * instead we remove only _its_ own_ job from job list.
> + * instead we remove only _its_ own_ job from job list
> + * (if it has one).
> * This makes "jobs .... | cat" more useful.
> */
> - freejob(curjob);
> + if (jp)
> + freejob(curjob);
> return;
> }
> #endif
> @@ -6607,9 +6608,9 @@ evalbackcmd(union node *n, struct backcmd *result
>
> if (pipe(pip) < 0)
> ash_msg_and_raise_perror("can't create pipe");
> - /* process substitution uses NULL job/node, like openhere() */
> + /* process substitution uses NULL job, like openhere() */
> jp = (ctl == CTLBACKQ) ? makejob(/*n,*/ 1) : NULL;
> - if (forkshell(jp, (ctl == CTLBACKQ) ? n : NULL, FORK_NOJOB) == 0) {
> + if (forkshell(jp, n, FORK_NOJOB) == 0) {
> /* child */
> FORCE_INT_ON;
> close(pip[ip]);
> diff --git a/shell/ash_test/ash-signals/usage.right b/shell/ash_test/ash-signals/usage.right
> index c0dbd6c3c..df1ed2dd7 100644
> --- a/shell/ash_test/ash-signals/usage.right
> +++ b/shell/ash_test/ash-signals/usage.right
> @@ -6,6 +6,18 @@ trap -- 'a' INT
> trap -- 'a' USR1
> trap -- 'a' USR2
> ___
> +trap -- 'a' EXIT trap -- 'a' INT trap -- 'a' USR1 trap -- 'a' USR2
> +___
> +trap -- 'a' EXIT
> +trap -- 'a' INT
> +trap -- 'a' USR1
> +trap -- 'a' USR2
> +___
> +trap -- 'a' EXIT
> +trap -- 'a' INT
> +trap -- 'a' USR1
> +trap -- 'a' USR2
> +___
> ___
> trap -- 'a' USR1
> trap -- 'a' USR2
> diff --git a/shell/ash_test/ash-signals/usage.tests b/shell/ash_test/ash-signals/usage.tests
> index d29c6e74a..34e24cceb 100755
> --- a/shell/ash_test/ash-signals/usage.tests
> +++ b/shell/ash_test/ash-signals/usage.tests
> @@ -10,6 +10,18 @@ trap "a" EXIT INT USR1 USR2
> echo ___
> trap
>
> +# show them by command substitution
> +echo ___
> +echo $(trap)
> +
> +# show them by pipe
> +echo ___
> +trap | cat
> +
> +# show them by process substitution
> +echo ___
> +cat <(trap)
> +
> # clear one
> echo ___
> trap 0 INT
> --
> 2.39.2
>
> _______________________________________________
> busybox mailing list
> busybox@busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic