2012-12-18 93 views
0

我的bash腳本的樣子:如何檢測等待來自bash腳本的用戶輸入?

read -p "Do you wish to continue?" yn 
# further actions ... 

而我只是想用的NodeJS/child_process這個腳本互動。 如何檢測到它正在等待用戶輸入?

var spawn = require('child_process').spawn; 
var proc = spawn('./script.sh'); 
proc.stdout.on("data", function(data) { 
    console.log("Data from bash"); 
} 
proc.stdin.on("data", function(data) { 
    console.log("Data from bash"); // doesn't work :/ 
} 

謝謝!

+0

所以你沒有看到「你想繼續嗎?」 –

+0

對,我沒有看到這個輸出。 – dreamcocoa

回答

0

bash man page:上標準誤差

read -p prompt 

顯示提示,沒有一個尾隨的換行符, 之前試圖讀取任何輸入。僅當來自終端的輸入是 時,提示纔會顯示

而且我不認爲有一個在node.js中的任何方法來檢測腳本是等待輸入。問題實際上是bash檢測到非終端並將輸出禁用到標準錯誤。即使如此,你也必須從stderr中讀取,而不是stdin來檢測任何等待狀態。最後,正如Antoine指出的那樣,您可能不得不使用諸如emptyExpect之類的工具來包裝您的shell腳本並欺騙Bash認爲它在終端中。

Btw .: proc.stdin.write("yes\n")正常工作。因此,您可以使用腳本,但不會在proc.stderr上收到任何提示,並且在腳本實際讀取輸入時不會知道。即使腳本尚未處於read -p聲明中,您也可以立即輸入proc.stdin.write。輸入緩衝直到腳本吃完爲止。

+0

謝謝!我以某種方式跳過了這個通知。 – dreamcocoa

1

您是否嘗試過使用「expect」http://en.wikipedia.org/wiki/Expect? 這是一個「期望」某些文本(它使用正則表達式)的工具,bash腳本可以自動應答。

+0

對於一個node.js問題不適合的答案 –