2011-07-06 77 views
1

下面是我正在編寫的腳本的簡化示例(不按原樣運行)。Bash腳本不會將輸入重定向到子進程

我想從我的腳本直接指定STDOUT到子進程的STDIN。

在下面的例子中,我正在給'STDOUT'寫'test',並希望它進入最終將其寫入文件輸出的子進程。

#!/bin/bash 
exec 4<&1 
(cat >/tmp/output)& <&4 
while true; do echo test; sleep 1; done 
+0

我不確定要了解您希望腳本執行的操作。你希望'echo test'的輸出指向另一個進程的STDIN,不是嗎? – jopasserat

+0

是的,這就是我想要做的,coproc是一個完美的解決方案。我從這個問題中抽象出來的底層問題是,在這種情況下,協處理器是netcat,我特別需要將其作爲子進程運行,以便我可以監視它何時退出(由於網絡錯誤或服務器重啓導致套接字連接失敗)並重新啓動連接或將標誌設置爲緩衝區輸出,直到可以重新建立連接。 –

回答

2

您也可以嘗試使用命名管道(fifos)設置一個簡單的客戶端服務器系統。

見:Send command to a background process(進一步參考)

+0

coproc是我沒有完全理解的功能。很好,謝謝。我很容易做到我需要的東西,現在「coproc」過程可以很容易地從外部腳本接收輸入。 –

0

這個例子很奇怪。你想把echo test標準輸出附加到/ tmp/output嗎?如果是這樣,

while true 
do 
    echo test >> /tmp/output 
    sleep 1 
done 
+0

也許有點過於簡單了。回聲測試本質上取代了監視狀態文件更改的大部分代碼,對其進行分析並最終需要使用netcat將一些結果寫入套接字(或者,如果netcat進程無法連接,則寫入緩衝區文件到服務器,或者如果它失去了連接)。 –

2

A(半)標準,這樣的事情方法是:

 
#!/bin/sh 

test -t 1 && { $0 ${1+"[email protected]"} | cat > /tmp/output; exit; } 
... 

如果腳本與上一個tty標準輸出上運行,它是重新運行 與輸出管道輸送給貓。

1

在bash中,你可以使用進程替換創建子進程和exec重定向腳本的輸出:

#!/bin/bash 
exec > >(cat >/tmp/output) 
while true; do echo test; sleep 1; done 
+0

有趣的是,謝謝你,我曾經玩過這種方法,但無法解決語法問題,並認爲我剛剛嘗試過。 –

0

的最終解決方案,這要歸功於@ jon指向coproc的指針:

#!/bin/bash 
coproc CPO { cat >/tmp/output; } 
while true; do echo test >&${CPO[1]}; sleep 1; done 

實際上,'echo test'被一個複雜的af序列監視和解析ile,並且cat子進程被netcat替換爲服務器,並且該連接使用netcat進程退出時的陷阱進行監視。

感謝所有偉大的答案!

相關問題