如何在bash脚本中异步监听?

时间:2012-02-08 13:26:45

标签: linux bash http

是否可以在bash脚本中进行异步tcp监听? 请您提供一个简单的例子或描述相同内容的链接。

1 个答案:

答案 0 :(得分:0)

这是一个hacky irc客户端(我们称之为stackirc)作为一个例子(使用telnet,但你可以很容易地选择使用netcat或bash的内置/ dev / tcp处理)你将需要telnet和Xdialog来使用它,但它基本上只产生一个子shell来观察一个文件(使用Xdialog --tailbox ...),稍后由telnet更新。在这个例子中,我使用了标准管道,但如果使用命名管道,它可能更具适应性和清晰度。

#!/bin/sh
echo starting irc > $HOME/.irclog
eval `Xdialog --stdout --separator " " --3inputsbox "setup" 0 0 \
        "USER=" "stackuser-$RANDOM" \
        "SERVER=" "irc.freenode.net" \
        "CHANNEL=" "#stackoverflow" \
      |while read USER SERVER CHANNEL; do
        echo SERVER=\"$SERVER\" USER=\"$USER\" CHANNEL=\"$CHANNEL\"
        break
    done`
#this is where we will get our asynchronous data
Xdialog --title "$CHANNEL irc" --tailbox $HOME/.irclog 30 99 &
XDPID=$!
A='NICK '$USER'
USER '$USER' +iw '$USER' :ashirc
JOIN '$CHANNEL' '$USER
while ([ "$A" ]) do   echo "$A" #this sends the data to the pipe at the end
    A=`Xdialog --timeout 200 --stdout --title "AshIRC message dialog" \
        --inputbox "Enter an IRC message for $CHANNEL" 0 0`
   case $? in
      255)A=PONG;;
      1)kill $XDPID;;
      0)echo $USER:$A >> $HOME/.irclog #see our messages too
        A='PRIVMSG '"$CHANNEL"' :'"$A"'.';; 
   esac
done | telnet $SERVER 6667 | while read LINE; do
    echo ${LINE%%!*}:${LINE#:*:}
done>> $HOME/.irclog