2016-05-08 64 views
1

作爲練習,我試圖使用node.js中的systemcall將一個小文本文件寫入/ tmp目錄。這裏是我的代碼:node.js:使用systemcall將文件寫入/ tmp目錄時遇到問題

#!/bin/node 
var child_process = require("child_process"); 
var send = "Hello, world!"; 
child_process.exec('cat - > /tmp/test1', { input: send }); 

該文件實際上被創建;但是,沒有內容被放置在其中。事情只是掛起。有人能告訴我我錯過了什麼嗎?

此外,我真的很想知道如何做到這一點同步。

感謝您的任何意見。

... doug 
+1

輸入應該做什麼?我在'exec'的文檔中沒有看到任何地方。我想你需要爲此使用'spawn'。 –

+0

嗯。我沒有注意到這一點。似乎所有的同步進程都有輸入選項,而沒有一個異步進程擁有它。 「input」是要傳遞給stdin的字符串值。如前所述,無論如何,我想切換到同步。我認爲我的問題的一部分是,當我們需要一個庫將其分配給一個變量時,我感到困惑。我不習慣那樣。看來變量的名字也很重要。你能否介紹一下這個問題。我認爲這可能會有所幫助。 – user3311045

+0

也許這會更好,如果我只是切入追逐。如何更改我的代碼以便使用child_process.execSync而不是child_process.exec?我認爲只需在第二行代碼中將「child_process.exec」更改爲「child_process.execSync」即可輕鬆完成。但是,這似乎並不奏效。我收到有關沒有exec.Sync方法的投訴。 – user3311045

回答

1

hm除非我忘了rtm,這段代碼將永遠不會工作。 cp.exec沒有這樣的輸入選項。

但是有一個stdio選項,會讓我們打開孩子的預期stdio。

child_process.exec('cat - > /tmp/test1', { stdio: 'pipe' }); 

https://nodejs.org/api/child_process.html#child_process_options_stdio

stdio s爲不串,它們是流,我們可以結束/寫/管材/關閉/推等

看到https://nodejs.org/api/stream.html

注意,標準輸入是一個可寫,stdout/stderr是可讀的。

要編寫cat的stdin,您現在將使用cp.stdin對象並調用其end()方法。

child_process.exec('cat - > /tmp/test1', { stdio: 'pipe' }).stdin.end('hello world'); 

請注意,end方法是一個寫入,然後流終止,這是告訴貓退出所需的流。

爲了確保工作正常,我們應該重構它,不要將stdin發送到文件,而是將child.stdout傳遞給process.stdout。

var child_process = require('child_process'); 
var cp = child_process.exec('cat -', { stdio: 'pipe' }); 
cp.stdin.end('hello world'); 
cp.stdout.pipe(process.stderr); 

請注意,該過程是一個全球性的。

+0

真棒解決方案。謝謝。我終於得到了我最初努力工作的東西。我會提供它作爲答案。 – user3311045

1

我終於得到了我原來的工作方式。最大的絆腳石是知道同步方法僅在Node.js的0.12版本(及更高版本)中可用。這裏是我終於開始工作的代碼:

#!/usr/local/n/versions/node/0.12.14/bin/node 

var child_process = require('child_process'); 
var send = "Hello, world!" 
child_process.execSync('cat - > /tmp/test1', { input : send }).toString(); 

感謝所有的幫助。

... doug