函数中的重定向错误

函数中的重定向错误

我试图找出为什么下面的代码不起作用,并给我一个错误Bad file descriptor。这是一种后续行动这个问题适用于我当前正在编写的脚本。

在调用者的早期,它exec 3>&1被运行,并且在调用下面的(通用)函数之前没有任何东西显式地改变它,如下所示:

exec 3>&1
...
string=$(GetString)

GetString 看起来像这样:

GetString()
{
    4>&1 1>&3    #save pipe end and change output back to caller's
    controlvar=0

    while ((controlvar != 1))
    do    
        printf "some stuff for the interactive user\n"
        read -p "my prompt" variable
        if ValidationFunction $variable; controlvar=1;fi    #tests for valid input
    done
    exec 1>&4-    #change output back to pipe end
    echo $variable
}

Bad file descriptor在倒数第二行收到错误。

这里发生了什么?请注意,我也没有在脚本中的其他地方对 fd/4 执行任何显式操作。

答案1

你的问题有几个问题。

线路

4>&1 1>&3

缺少执行人员:

exec 4>&1 1>&3

还有那行:

exec 1>4&-

应该读

exec 1>&4-

简化的脚本应如下所示:

GetString()
{
    exec 4>&1 1>&3    #save pipe end and change output back to caller's
    printf "some stuff for the interactive user\n"
    sleep 3    
    exec >&4-         #change output back to pipe end
    echo "test value"
}

exec 3>&1
string=$(GetString)
echo "final value <$string>"

这个脚本是有道理的。

请编辑问题以实际重现您的问题。

相关内容