Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Read/write multiple histories from non-interactive shell



I wish it were that simple a case. Turns out there are other cases where a script that runs well in non-interactive move would crash when run with -i. In my case it was trap for TSTP. A workaround is to put ``setopt nomonitor``, which in my case is valid as I don't need job control. Though what is interesting is that the script ends with an error code of 0. Anyway the exit behavior itself is inconsitent. Try two experiments: 1) add ``trap 'foo=1' TSTP`` as first line of your sample code in this thread. This time zsh would complain but not exit. 2) add ``trap 'foo=1' TSTP`` to your function read-field() or in while loop. This time zsh will exit with error code 1. In my script, where the trap is somewhere in 3 or 4th level function in the stack, the script exits with exit code 0.

Here's the link to relevant part of code:
https://github.com/zsh-users/zsh/blob/b1533066ca7d50c88b37ce72093c12cf19807818/Src/signals.c#L921-L924
```
    if (jobbing && (sig == SIGTTOU || sig == SIGTSTP || sig == SIGTTIN)) {
        zerr("can't trap SIG%s in interactive shells", sigs[sig]);
        return 1;
    }
```

I figured ``setopt nomonitor`` disables jobbing, and bypasses executing that if block.

On Mon, Feb 13, 2023 at 1:43 AM Roman Perepelitsa <roman.perepelitsa@xxxxxxxxx> wrote:
On Mon, Feb 13, 2023 at 9:57 AM OG Code Poet <ogcodepoet@xxxxxxxxx> wrote:
>
> My larger script misbehaves and exits with 0 before it could
> complete if I replace #!/usr/bin/env zsh with #!/usr/bin/env -S zsh
> -fi or #!/usr/bin/env -S zsh -i.

You might want to try to figure out why.

> Is there a restriction on starting any existing functional zsh
> program with -fi? Put another way, are all non-interactive shell
> scripts guaranteed to function when shebang is changed to
> #!/usr/bin/env -S zsh -fi??

If you put something like this in a script, it won't work the same way
in interactive shell:

    [[ -o interactive ]] && exit

In general, if your script needs interactive features, it makes
perfect sense to use an interactive shell as the interpreter.

Roman.


Messages sorted by: Reverse Date, Date, Thread, Author