If $var is non-empty and not a valid a number, {var}>&- silently closes fd 0.
var=x; (exec {var}>&-; test -e /dev/fd/0); echo $? 1 Seems like the test of the return value of legal_number is incorrect. --- redir.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redir.c b/redir.c index 804d9b82..267a9fc8 100644 --- a/redir.c +++ b/redir.c @@ -1459,7 +1459,7 @@ redir_varvalue (REDIRECT *redir) if (val == 0 || *val == 0) return -1; - if (legal_number (val, &vmax) < 0) + if (legal_number (val, &vmax) <= 0) return -1; i = vmax; /* integer truncation */ -- 2.40.0