Unfortunately, macOS does not support proofs, so there’s no nice way to do it the way you recommended.

I can just force-close the first 1024 file descriptors that I don’t care about, and hope that it’s sufficient.

On Sat, May 21, 2022 at 3:02 PM Bart Schaefer <schaefer@brasslantern.com> wrote:
On Fri, May 20, 2022 at 11:32 PM Zach Riggle <zachriggle@gmail.com> wrote:
>
> This is probably an usual request, but is there any way to close (or redirect to /dev/null) all open file descriptors known / opened by zsh?

I expected this to work if you have /proc/:

opened=(/proc/self/fd/*(:t)) wanted=(0 1 2 10)
for close in ${^${opened:|wanted}}; exec {close}>&-

But zsh temporarily opens a file descriptor (for xtrace output, I
believe) during the assignment to $opened, and it's not possible to
predict what number that descriptor will have, which means one of
those exec is going to error on bad file descriptor and kill the loop.

So ... the following seems to be pretty good, though on repeated tries
I have sometimes seen descriptors remain open:

integer close
for close in /proc/self/fd/*(:t); [[ -h /proc/self/fd/$close && ! -t
$close ]] && exec {close}>&-

> Is there a way to close all of them in a concise way that does not affect e.g. shell pipelines and redirection (i.e., stdout and stderr)?

No guarantees about that.  If there are descriptors open for temporary
files, etc., that are needed by coproc or whatever, this could break
it.
--

Zach Riggle