2013-01-18 59 views
52

我有一個bash腳本,它使用read命令以交互方式讀取命令參數,例如yes/no選項。有沒有辦法在非交互式腳本中將默認選項值作爲參數傳遞給此腳本?以非交互方式將參數傳遞給交互式程序

這不只是一個選項,我必須傳遞給交互式腳本。

+2

如果從標準你可以管你輸入 –

+2

由於這個問題得到讀取重複很多,值得指出的是,它並不重要的語言交互程序被寫入。它可能是一個讀取標準輸入或Erlang應用程序的C程序,或其他任何程序。有些東西是從命令行運行的,並且令人討厭地要求交互式輸入,並且您希望將其自動化。 – tripleee

回答

22

如需更多e複雜任務有expecthttp://en.wikipedia.org/wiki/Expect)。 它基本上模擬一個用戶,你可以編寫一個腳本如何對特定的程序輸出和相關的東西作出反應。

這也適用於像ssh這種情況,禁止管道密碼。

+3

...雖然在SSH情況下適當的解決方案是切換到公鑰認證。 – tripleee

11

你可以把數據放到一個文件並重新引導它像這樣:

$ cat data.txt 
2 
3 

執行腳本:

$ file.sh < data.txt 
2 
3 
88

爲腳本
$ cat file.sh 
#!/bin/bash 

read x 
read y 
echo $x 
echo $y 

數據多種方式

管道y我們的輸入

echo "yes 
no 
maybe" | your_program 

重定向從文件

your_program < answers.txt 

使用here document(這可能是非常可讀)

your_program << ANSWERS 
yes 
no 
maybe 
ANSWERS 

使用here string

your_program <<< $'yes\nno\nmaybe\n' 
+2

它指出,這隻有在程序讀取標準輸入時纔有效。有些程序會自行閱讀,例如交互式密碼,即使標準輸入是管道。對於密碼,這是安全的原因;儘管一些交互式程序設計簡單。 – tripleee

+0

@tripleee除了你所說的線路,如何腳本讀取不受標準輸入密碼?我知道你可以使用'read'來獲取標準輸入,你可以用什麼函數來執行你描述的內容? – flow2k

+0

在這種情況下,你需要看,如果你想與之交互的程序必須輸入發送給它一個特殊的方式(例如sshpass,SSH代理),或使用期望腳本的相互作用。 –

3

只是想添加一個更多的方法。在別處找到它,而且很簡單。 假設我想在命令行中爲命令「execute_command」傳遞所有提示的yes,那麼我只需向它輸入yes即可。

yes | execute_command 

這將使用yes作爲所有yes/no提示的答案。