试图了解如何将<& 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}"
答案 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 /缓冲输出问题中突出显示缓冲问题。