使用 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 ))
}
我正在尝试制作一个脚本来测试程序,但我需要对文件描述符和重定向使用一些黑魔法。
但问题是我正在尝试使用 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 ))
}