重定向文件描述符时不需要打开文件描述符吗?

时间:2020-08-27 10:53:36

标签: bash stream file-descriptor

我已阅读(例如:How do file descriptors work?)要使用文件描述符3-9,我需要先打开它们。尝试在没有它的情况下使用它们会产生错误:

function f()
{
    echo hi 1>&3
}
f

输出:

bash: 3: Bad file descriptor

但是,如果我在调用函数时重定向它,一切似乎都可以正常工作

f 3>&1

输出:

hi

那么我是否需要打开文件描述符?

1 个答案:

答案 0 :(得分:1)

是的,您确实需要打开一个新的文件描述符,并且作为一个好习惯,您应该像这样最后关闭它:

f() {
    # open fd=3 redirecting to 1 (stdout)
    exec 3>&1

    # redirect stdout to fd=3
    echo hi >&3

    # close fd=3
    exec 3>&-
}

请注意,在调用函数时运行f 3>&1时,实际上是通过将文件描述符3重定向到&1(stdout)来打开文件描述符。