除非您按照接受的答案所示重定向stdout和stderr,否則這對execSync或spawnSync來說是不可能的。如果不重定向stdout和stderr,那麼這些命令只會在命令完成時返回stdout和stderr。
要做到這一點,而不會重定向輸出和錯誤,你將需要使用菌種要做到這一點,但它非常直截了當:
var spawn = require('child_process').spawn;
//kick off process of listing files
var child = spawn('ls', ['-l', '/']);
//spit stdout to screen
child.stdout.on('data', function (data) { process.stdout.write(data.toString()); });
//spit stderr to screen
child.stderr.on('data', function (data) { process.stdout.write(data.toString()); });
child.on('close', function (code) {
console.log("Finished with code " + code);
});
我用ls命令是遞歸列出文件,這樣就可以了快速測試。 Spawn將第一個參數作爲您要運行的可執行文件的名稱,因爲它是第二個參數,它需要一個表示要傳遞給該可執行文件的每個參數的字符串數組。
但是,如果你正在使用execSync設置,不能重定向stdout或stderr出於某種原因,你可以打開xterm這樣的其他終端,併爲其傳遞命令,如下所示:
var execSync = require('child_process').execSync;
execSync("xterm -title RecursiveFileListing -e ls -latkR /");
這將讓你看到你的命令在新終端中做了什麼,但仍然有同步呼叫。
此答案應被標記爲接受的答案。 – thorn
stdio [0,1,2]是什麼意思? – Richard
這意味着子進程將使用父進程的stdin,stdout和stderr流。所以當子進程寫入其中的任何一個時,它實際上會直接寫入父進程流。 – gregers