zsh:我需要关闭文件描述符吗?

zsh: Do I need to close file descriptors?

我使用以下代码将某些内容输出到标准输出,并将其通过管道传输到程序:

function example() {
    local fd1
    {
        exec {fd1}>&1
        { echo hi >&$fd1 } | true
    } always { exec {fd1}>&- }
}

我想知道我是否可以安全地放弃 always { exec {fd1}>&- }fd1 在函数完成后超出范围。

您需要保留 always { exec {fd1}>&- }。如果你摆脱它,包含文件描述符的变量将超出范围,但文件描述符不会关闭,导致泄漏。您可以通过在 运行 函数之前和之后执行 ls -l /proc/$$/fd 来查看这一点,而无需该行。该函数的每个 运行 都会将另一个 FD 永久添加到该列表中。最终,您将 运行 文件描述符不足,并且无法打开任何新的文件描述符,这会破坏一切。