下面是我正在編寫的腳本的簡化示例(不按原樣運行)。Bash腳本不會將輸入重定向到子進程
我想從我的腳本直接指定STDOUT到子進程的STDIN。
在下面的例子中,我正在給'STDOUT'寫'test',並希望它進入最終將其寫入文件輸出的子進程。
#!/bin/bash
exec 4<&1
(cat >/tmp/output)& <&4
while true; do echo test; sleep 1; done
下面是我正在編寫的腳本的簡化示例(不按原樣運行)。Bash腳本不會將輸入重定向到子進程
我想從我的腳本直接指定STDOUT到子進程的STDIN。
在下面的例子中,我正在給'STDOUT'寫'test',並希望它進入最終將其寫入文件輸出的子進程。
#!/bin/bash
exec 4<&1
(cat >/tmp/output)& <&4
while true; do echo test; sleep 1; done
您也可以嘗試使用命名管道(fifos)設置一個簡單的客戶端服務器系統。
見:Send command to a background process(進一步參考)
coproc是我沒有完全理解的功能。很好,謝謝。我很容易做到我需要的東西,現在「coproc」過程可以很容易地從外部腳本接收輸入。 –
這個例子很奇怪。你想把echo test
標準輸出附加到/ tmp/output嗎?如果是這樣,
while true
do
echo test >> /tmp/output
sleep 1
done
也許有點過於簡單了。回聲測試本質上取代了監視狀態文件更改的大部分代碼,對其進行分析並最終需要使用netcat將一些結果寫入套接字(或者,如果netcat進程無法連接,則寫入緩衝區文件到服務器,或者如果它失去了連接)。 –
A(半)標準,這樣的事情方法是:
#!/bin/sh test -t 1 && { $0 ${1+"[email protected]"} | cat > /tmp/output; exit; } ...
如果腳本與上一個tty標準輸出上運行,它是重新運行 與輸出管道輸送給貓。
在bash中,你可以使用進程替換創建子進程和exec
重定向腳本的輸出:
#!/bin/bash
exec > >(cat >/tmp/output)
while true; do echo test; sleep 1; done
有趣的是,謝謝你,我曾經玩過這種方法,但無法解決語法問題,並認爲我剛剛嘗試過。 –
的最終解決方案,這要歸功於@ 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進程退出時的陷阱進行監視。
感謝所有偉大的答案!
我不確定要了解您希望腳本執行的操作。你希望'echo test'的輸出指向另一個進程的STDIN,不是嗎? – jopasserat
是的,這就是我想要做的,coproc是一個完美的解決方案。我從這個問題中抽象出來的底層問題是,在這種情況下,協處理器是netcat,我特別需要將其作爲子進程運行,以便我可以監視它何時退出(由於網絡錯誤或服務器重啓導致套接字連接失敗)並重新啓動連接或將標誌設置爲緩衝區輸出,直到可以重新建立連接。 –