2016-09-04 31 views
3

我正在研究nodejs應用程序,並且需要將多行字符串輸入到shell命令中。我不是一個職業的shell腳本,但如果我在終端運行這個命令時,它工作得很好:用nodejs將一個javascript變量放入shell命令中

$((cat $filePath) | dayone new)

這就是我已經得到了該側的NodeJS。白晝命令確實有效,但沒有任何東西可以傳入。

const cp = require('child_process'); 
const terminal = cp.spawn('bash'); 

var multiLineVariable = 'Multi\nline\nstring'; 

terminal.stdin.write('mul'); 
cp.exec('dayone new', (error, stdout, stderr) => { 
    console.log(error, stdout, stderr); 
}); 
terminal.stdin.end(); 

感謝您的幫助!

回答

1

在這裏,你使用spawn啓動bash,但是你使用exec來啓動你的d​​ayone程序。他們是獨立的子進程,沒有任何連接。

'cp'只是對child_process模塊​​的引用,而spawn和exec只是啓動子進程的兩種不同方式。

您可以使用bash並將dayone命令寫入stdin以調用dayone(正如您的代碼片段似乎試圖這樣做),或者您可以直接使用exec直接調用dayone(請記住exec仍然運行命令在shell):

var multiLineVariable = 'Multi\nline\nstring'; 

// get the child_process module 
const cp = require('child_process'); 

// open a child process 
var process = cp.exec('dayone new', (error, stdout, stderr) => { 
    console.log(error, stdout, stderr); 
}); 

// write your multiline variable to the child process 
process.stdin.write(multiLineVariable); 
process.stdin.end(); 
+0

這很好,但我不知道爲什麼。在我們寫入'stdin'之前,似乎調用'cp.exec'會在有任何要讀取的內容之前執行'dayone'命令。你能解釋一下'dayone'命令如何獲得輸入嗎?謝謝! – danseethaler

+1

exec命令不會等待dayone完成/退出,因爲node.js塊中沒有任何內容。 Exec只是啓動進程,然後進程嘗試從標準輸入讀取。如果沒有任何可用的東西,它會阻止,直到有什麼東西,當我們開始這個過程時就會提供它。就像你手動從命令行運行它一樣,它會阻塞,直到你在它的標準輸入中輸入了某些東西。 –

+0

完美!非常感謝! – danseethaler

0

隨着Readable Streams它真的很容易聽的輸入

const chunks = []; 
process.stdin.on('readable',() => { 
    const chunk = process.stdin.read() 
    chunks.push(chunk); 
    if (chunk !== null) { 
    const result = Buffer.concat(chunks); 
    console.log(result.toString()); 
    } 
}); 

隨着Writable Streams你可以寫在標準輸出

process.stdout.write('Multi\nline\nstring'); 

希望我可以幫到你

相關問題