Bash 继续从tcp服务器读取,直到收到特定消息

Bash 继续从tcp服务器读取,直到收到特定消息,bash,shell,tcp,netcat,Bash,Shell,Tcp,Netcat,我有以下代码: echo "about to echo stuff 1"; echo -e "foo\n" | nc localhost "${ql_server_port}" | while read response; do echo "response from server: $response"; if [[ "$response" == "released" ]]; then echo "quicklock: Lock

我有以下代码:

 echo "about to echo stuff 1";

 echo -e "foo\n" | nc localhost "${ql_server_port}" | while read response; do
         echo "response from server: $response";
         if [[ "$response" == "released" ]]; then
            echo "quicklock: Lock was released.";
            return 0;
         fi
   done;

 echo "about to echo stuff 2";
以下是记录的内容:

我不明白为什么它不继续从netcat连接读取,似乎在收到第一条消息后停止读取。有人知道如何通过连接保持阅读吗


我猜管道关闭是因为echo语句存在?如果是这样,如何保持它打开?

这是可行的,但我正在寻找一种更简单的方法,如果可能的话:

     local named_pipe="$HOME/.quicklock/named_pipes/$$";
     mkfifo ${named_pipe};

      tail -f ${named_pipe} | nc localhost "${ql_server_port}" | while read response; do
         echo "response from server: $response";
         if [[ "$response" == "released" ]]; then
            echo "quicklock: Lock was released.";
            return 0;
         fi
      done &
   fi


     echo -e "{\"quicklock\":true}\n" > ${named_pipe}
     wait;

有没有办法回显某些内容,但不关闭进程?

文件描述符重定向到rescue

# make a copy of stdout
exec  3<&1
echo "about to echo stuff 1";

# read from fd 3
{ nc localhost 1234 <3 | while read response; do
    echo "response from server: $response";
    if [[ "$response" == "released" ]]; then
        echo "quicklock: Lock was released."
        break
    fi
done } &

# echo to stdout but redirect to fd 3
echo -e "foo\n" >3
echo -e "bar\n" >3
# close descriptor when done
exec  3<&-
# wait for comm to finish
sleep 2
echo "about to echo stuff 2";

我问了这个问题-是的,我做了一些研究,你所需要做的就是保持第一个过程是开放的。echo将在写入标准输出后死亡。如果您创建了一个在写入stdout后仍然有效的进程,那么这就是您所需要的。
# make a copy of stdout
exec  3<&1
echo "about to echo stuff 1";

# read from fd 3
{ nc localhost 1234 <3 | while read response; do
    echo "response from server: $response";
    if [[ "$response" == "released" ]]; then
        echo "quicklock: Lock was released."
        break
    fi
done } &

# echo to stdout but redirect to fd 3
echo -e "foo\n" >3
echo -e "bar\n" >3
# close descriptor when done
exec  3<&-
# wait for comm to finish
sleep 2
echo "about to echo stuff 2";
about to echo stuff 1
response from server: bin
response from server: gar
response from server: released
quicklock: Lock was released.
about to echo stuff 2