我试图找出为什么下面的代码不起作用,并给我一个错误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>"
这个脚本是有道理的。
请编辑问题以实际重现您的问题。