一开始,我创建了一个小型服务器,netcat
并且运行良好:
#!/bin/bash
PORT="1234";
startServer(){
fifo="fifo/$1";
mkfifo "$fifo";
connected="0";
netcat -q 0 -l -p "$PORT" < "$fifo" | while read -r line; do
if [ "$connected" == "0" ];then
#listen for a new connection
startServer $(($1+1))&
connected="1";
fi
#server logic goes here
done > "$fifo";
rm "$fifo";
}
mkdir fifo;
startServer 0;
它使用 fifos 将主循环输出重定向回netcat
.
每次调用都会startServer
增加 的值$1
并创建一个 fifo 文件fifo/$1
。
但我想用bash 自动创建文件描述符摆脱fifo
文件和startServer
.
经过多次尝试,这是我当前尝试修改该startServer
功能的尝试。我可以接收来自客户的线路,但不幸的是它没有收到任何回复。我很困惑到底出了什么问题。
startServer(){
connected="0";
#create file descriptor and read output from main loop
exec {fd}> >( netcat -q 0 -l -p "$PORT" | while read -r line; do
if [ "$connected" == "0" ];then
#listen for a new connection
startServer&
connected="1";
fi
#server logic goes here
done ) >&$fd;
#close file descriptor
exec {fd}<&-;
exec {fd}>&-;
}
另外,我无法使用 netcat 的“-e”选项,因为它在 netcat-openbsd 软件包中不可用。
答案1
不能fd
在同一个命令中设置和使用;你正在有效地做exec {fd}> ... >&$fd
。可行的方法是首先使用一些简单的命令(例如:
.例如:
startServer(){
local connected=0 fd
exec {fd}<> <(:)
nc -q 0 -l -p "$PORT" <&$fd |
while read -r line
do if [ "$connected" == "0" ]
then startServer $(($1+1)) &
connected="1"
fi
echo server $1 logic goes here
done >&$fd
exec {fd}<&-
}