2012-02-21 64 views
1

我很新的shell腳本,我試圖去用管道交手。我可以在這裏完全錯誤的方向...使用命名管道來創建一個「迴路」

我有一個shell腳本,它包含一個簡單的while循環,在這個循環內,我正在使用netcat監聽指定的端口和管道輸入二進制文件,通過stdin等待命令。這是腳本-A

我有一個接受輸入作爲參數第二shell腳本,它就會回聲這些參數的端口的netcat監聽的。這是腳本-B

我的目標是讓從位於腳本-A到通過Netcat的腳本-B的二進制文件返回的輸出,使得它可以通過標準輸出返回。二進制文件必須被初始化並等待輸入。

這是我有:

腳本-A

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

腳本-B

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

採用這種設置,二進制文件的輸出是通過腳本-A進行 做一些研究,我得到了這一點後,我試圖使用命名管道創建一個從二進制文件回netcat的一種循環,它仍然沒有工作 -

腳本-A

mkfifo foobar 

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

腳本-B沒有改變。

請記住我的shell腳本的經驗莖一段關於一個單一的一天,謝謝。

+0

更新我的回答... – Kaii 2012-02-22 12:56:21

回答

1

問題出在您的腳本B中。netcat從STDIN中讀取並在STDIN關閉時立即退出,而不是等待響應。

,當你這樣做,你會發現:

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

nc有標準輸入行爲參數..

-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" 
+0

感謝您的答覆,我不能回到測試幾天。我沒有忘記這個問題 - 別擔心! – 2012-02-23 10:12:31

+0

@AnonyStansbridge所以......你解決了你的問題嗎? – Kaii 2012-02-29 08:42:26

+0

完美工作:-)感謝您的耐心和堅持! – 2012-02-29 16:52:48