我对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脚本编制经验大约持续一天,谢谢。
答案 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"