使用命名管道创建“循环”

时间:2012-02-21 11:32:32

标签: linux bash shell pipe

我对shell脚本非常陌生,我正试图掌握管道。我可能会走向错误的方向...

我所拥有的是一个包含一个简单的while循环的shell脚本,在这个循环中我得到netcat来侦听指定的端口并将输入传递给正在等待命令通过stdin的二进制文件。这是Script-A

我有第二个shell脚本接受输入作为参数,然后将这些参数发送到netcat正在侦听的端口。这是Script-B

我的目标是通过Netcat从Script-A中的二进制文件返回输出到Script-B,以便可以通过stdout返回。必须初始化二进制文件并等待输入。

这就是我所拥有的:

脚本-A

while true; do
    nc -kl 1234 | /binarylocation/ --readargumentsfromstdinflag
done

脚本-B

foo=$(echo "$*" | nc localhost 1234)
echo "$foo"

使用此设置,二进制文件的输出通过Script-A完成 经过一些研究后我得到了这一点,我试图使用命名管道从二进制文件创建一种循环回到netcat,它仍然无法正常工作 -

脚本-A

mkfifo foobar

while true; do
    nc -kl 1234 < foobar | /binarylocation/ --readargumentsfromstdinflag > foobar
done

脚本B没有改变。

请记住,我的shell脚本编制经验大约持续一天,谢谢。

1 个答案:

答案 0 :(得分:1)

问题在于你的脚本B .. netcat从STDIN读取并在STDIN关闭时立即退出,而不是等待响应。

当你这样做时你会意识到:

foo=$( ( echo -e "$*"; sleep 2 ) | nc localhost 1234) 
echo "$foo"

nc有一个stdin行为的参数..

 -q    after EOF on stdin, wait the specified number of seconds and 
       then quit. If seconds is negative, wait forever.`

所以你应该这样做:

foo=$( echo -e "$*" | nc -q5 localhost 1234) 
echo "$foo"