从无限循环中的管道输入读取行

时间:2013-02-08 17:34:01

标签: bash shell named-pipes

我在bash中创建了一个简单的脚本作为http代理。

#!/usr/bin/env bash

trap "kill 0" SIGINT SIGTERM EXIT  # kill all subshells on exit

port="6000"

rm -f client_output client_output_for_request_forming server_output
mkfifo client_output client_output_for_request_forming server_output  # create named pipes

# creating subshell
(
    cat <server_output |
    nc -lp $port |  # awaiting connection from the client of the port specified
    tee client_output |  # sending copy of ouput to client_output pipe
    tee client_output_for_request_forming # sending copy of ouput to client_output_for_request_forming pipe
) &   # starting subshell in a separate process

echo "OK!"

# creating another subshell (to feed client_output_for_request_forming to it)
(
    while read line;  # read input from client_output_for_request_forming line by line
    do
        echo "line read: $line"
        if [[ $line =~ ^Host:[[:space:]]([[:alnum:].-_]*)(:([[:digit:]]+))?[[:space:]]*$ ]]
        then
            echo "match: $line"
            server_port=${BASH_REMATCH[3]}  # extracting server port from regular expression
            if [[ "$server_port" -eq "" ]]
            then
                server_port="80"
            fi
            host=${BASH_REMATCH[1]}  # extracting host from regular expression
            nc $host $server_port <client_output |  # connect to the server
            tee server_output  # send copy to server_output pipe
            break
        fi
    done

) <client_output_for_request_forming


echo "OK2!"

rm -f client_output client_output_for_request_forming server_output

我在第一个终端开始。它输出OK!

在第二个我输入:

netcat localhost 6000

然后开始输入文本行,期望它们显示在第一个终端窗口中,因为有一个循环while read line。但没有显示任何内容。

我做错了什么?我怎样才能使它发挥作用?

1 个答案:

答案 0 :(得分:3)

如果没有进程从client_output fifo读取,则后台管道无法启动。由于在client_output读取一行后才会开始读取client_output_for_request_forming的流程,因此您的流程会被阻止。