sua*_*kim 132 child-process node.js
我想使用execSync在NodeJS 0.12中添加的方法,但仍然在控制台窗口中输出我运行Node脚本的输出.
例如,如果我运行具有以下行的NodeJS脚本,我希望在控制台内看到rsync命令的完整输出"live":
require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"');
Run Code Online (Sandbox Code Playgroud)
我明白execSync返回命令的输出,我可以在执行后将其打印到控制台,但这样我没有"实时"输出...
gre*_*ers 273
require('child_process').execSync(
'rsync -avAXz --info=progress2 "/src" "/dest"',
{stdio: 'inherit'}
);
Run Code Online (Sandbox Code Playgroud)
Eth*_*han 16
你可以简单地使用.toString().
var result = require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"').toString();
console.log(result);
Run Code Online (Sandbox Code Playgroud)
这已在Node上测试过v8.5.0,我不确定以前的版本.根据@etov,它不起作用v6.3.1- 我不确定中间.
Bri*_*ian 14
除非您按照接受的答案建议重定向stdout和stderr,否则使用execSync或spawnSync是不可能的.在不重定向stdout和stderr的情况下,这些命令仅在命令完成时返回stdout和stderr.
要在不重定向stdout和stderr的情况下执行此操作,您将需要使用spawn来执行此操作,但它非常直接:
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);
});
Run Code Online (Sandbox Code Playgroud)
我使用了一个递归列出文件的ls命令,以便您可以快速测试它.Spawn将您尝试运行的可执行文件名作为第一个参数,因为它是第二个参数,它采用一个字符串数组来表示要传递给该可执行文件的每个参数.
但是,如果您设置使用execSync并且由于某种原因无法重定向stdout或stderr,您可以打开另一个终端,如xterm,并传递一个命令,如下所示:
var execSync = require('child_process').execSync;
execSync("xterm -title RecursiveFileListing -e ls -latkR /");
Run Code Online (Sandbox Code Playgroud)
这将允许您查看您的命令在新终端中正在执行的操作但仍具有同步调用.
简单地:
try {
const cmd = 'git rev-parse --is-inside-work-tree';
execSync(cmd).toString();
} catch (error) {
console.log(`Status Code: ${error.status} with '${error.message}'`;
}
Run Code Online (Sandbox Code Playgroud)
// nodejs
var execSync = require('child_process').execSync;
// typescript
const { execSync } = require("child_process");
try {
const cmd = 'git rev-parse --is-inside-work-tree';
execSync(cmd).toString();
} catch (error) {
error.status; // 0 : successful exit, but here in exception it has to be greater than 0
error.message; // Holds the message you typically want.
error.stderr; // Holds the stderr output. Use `.toString()`.
error.stdout; // Holds the stdout output. Use `.toString()`.
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
80141 次 |
| 最近记录: |