BASH捕获<& 3到var

时间:2014-01-04 11:06:33

标签: bash var netcat

试图了解如何将<& 3重定向捕获到bash中的var中。

当我运行下面的代码时,它会在第9行停止并打印MSG to SEND,就好像cat <&3正在运行而没有在var myRcvMsg中捕获它一样。如果我在端口上打开另一个shell和nc,它会继续打印出发送的每一行(这就是我想要的,只需要捕获它而不是打印它)

如果我将行更改为myRcvMsg="$(<&3)",则行10,11执行但不打印var。

我做错了什么?

THX 领域

#!/bin/bash

echo "Starting Script"
exec nc -p 18000 -l &
sleep 1                                  # wait for port to open
exec 3<>/dev/tcp/192.168.1.1/18000
echo "MSG to SEND" >&3
echo "MSG has been sent"
myRcvMsg="$(cat <&3)"
echo "MSG should have been RCV'd"
echo "This is the RCV msg:${myRcvMsg}"

2 个答案:

答案 0 :(得分:0)

尝试阅读

myRcvMsg="$(cat /dev/fd/3)"

答案 1 :(得分:0)

执行nc会将其置于侦听模式,但它会将其输出写入stdout而不是通过网络回显。有关如何将其变为echo服务器的建议,请参阅Echo server with bash

在我的机器上,我必须使用127.0.0.1才能建立连接。

接下来的问题是你必须确保你的消息没有卡在缓冲区中。当你在&amp; 3的外端等待nc回应某些东西时,nc可能实际上没有看到你的消息。在我的测试中,$(cat <&3)只是挂起。

以下类型的作品。

#!/bin/bash

set -x
echo "Starting Script"
exec nc -p 18000 -l -c "xargs -n1 echo" &
sleep 1                                  # wait for port to open
exec 3<>/dev/tcp/127.0.0.1/18000
cat <&3 >ttt &
sleep 1
echo "MSG to SEND" >&3
echo "MSG has been sent"
sleep 1
myRcvMsg=$(cat ttt)
echo "MSG should have been RCV'd"
echo "This is the RCV msg:\"${myRcvMsg}\""

有关详细信息,请参阅http://www.ict.griffith.edu.au/anthony/info/shell/co-processes.hints 3 /缓冲输出问题中突出显示缓冲问题。