2015-01-13 47 views
2

我有一個簡單的java程序(將其視爲Apple的Siri),當從終端啓動時,等待用戶鍵入問題,然後打印出回覆。我想創建一個啓動java程序的bash腳本,然後給它一些問題(就好像一個人正在鍵入它們一樣)。這是我的嘗試:通過bash腳本向Java程序提供輸入

#!/bin/bash 
# change to project directory 
cd C:/JavaProjects/VirtualButler 

#compile the program 
javac Alfred.java 

#start the program 
java Alfred 

#Give it questions 
echo Hey what time is it?\r 
echo When is my next meeting?\r 

#keep the terminal open so I can see the answer 
PAUSE 

然而,當我運行bash腳本,在處理卡在的Java阿爾弗雷德線(這是在開CMD運行,等待用戶鍵入的問題和只有當我終止Java程序時,處理纔會繼續,並且得到我想要自動傳遞給Java程序的問題。有沒有辦法在Java程序運行時自動將這些問題傳遞給Java程序cmd?

回答

3

假設bash 4.0及更高版本,您可以使用coproc命令。

# Starts Alfred in a background process with pipes in and out of it 
coproc java Alfred 
# Alfred's stdin is now referred to with ${COPROC[1]} 
echo Hey what time is it?\r >&${COPROC[1]} 
echo When is my next meeting?\r >&${COPROC[1]} 
# Alfred's stdout is found with ${COPROC[0]} 
cat <&${COPROC[0]} 

請注意,從這裏開始,cat會掛起,因爲文件描述符中沒有EOL。如果阿爾弗雷德退出跑步,那麼貓會停下來。我會告訴你如何判斷阿爾弗雷德什麼時候完成以及該怎麼做。

+0

'coproc'的好用# – anubhava

+0

謝謝,這正是我一直在尋找的! – 1vko

+0

所以,當我早些時候嘗試這種方法時,我只是在終端上鍵入命令,一切正常。但是,當我將代碼放入bash腳本並運行腳本時,我收到一條錯誤消息** testScript.sh:2:testScript.sh:coproc:not found **。我有bash 4.3.11版本,但_coproc_似乎無法通過bash腳本識別(即使它在終端上輸入時工作正常)。我可能在bash腳本中犯了一些語法錯誤,但我無法弄清楚什麼。你能告訴我我可能會做什麼錯嗎?謝謝! – 1vko

1

這將重定向輸入:

java Alfred < <(printf "Hey what time is it?\r When is my next meeting?\r")