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

Re: Close *all* file descriptors

On Fri, May 20, 2022 at 11:32 PM Zach Riggle <zachriggle@xxxxxxxxx> 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

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