使用 exec 关闭 bash 中的文件描述符时出错

Error while closing file descriptors in bash with exec

我正在尝试制作一个脚本来测试程序,但我需要对文件描述符和重定向使用一些黑魔法。
但问题是我正在尝试使用 exec file_descriptor > &- 来关闭它但是脚本在这里抛出错误是代码和错误:

for fd in "${fds[@]}"; do
    echo "Closing fd $fd and remove pipes"
    exec $fd<&-
    rm -f pipe$fd
done

fd 是 created/stored 像这样:

pfd=25 #I start the file descriptors to 25 because my program open some file descriptors
fds=()
mkfifo pipe$pfd
exec $pfd>pipe$pfd
fds+=$pfd
pfd=$((( $pfd + 1 )))

错误是

exec: 25: not found

我不知道为什么,但 exec 不想与变量一起执行,当我删除变量并输入数字时,它起作用了。但是我需要放置变量,所以我不知道如何解决这个问题。

正确的语法是:

exec {fd}<&-

请注意,这需要 bash 4.1 或更高版本;如果不使用 eval.

,早期版本无法替换文件描述符编号

也就是说,考虑让 bash auto-allocate 所有描述符编号,并将它们从您的管道编号中分离出来。

pipe_names=( )
pipe_fds=( )
pipe_num=0

newpipe() {
  local pfd_new pipe_name="pipe${pipe_num}"
  mkfifo "$pipe_name" || return
  exec {pfd_new}>"$pipe_name" || return
  pipe_fds[$pipe_num]=$pfd_new
  pipe_names[$pipe_num]=$pipe_name
  (( ++pipe_num ))
}