首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nodejs生成具有字符串而不是数组的命令?

nodejs生成具有字符串而不是数组的命令?
EN

Stack Overflow用户
提问于 2019-08-09 12:22:46
回答 3查看 3.4K关注 0票数 7

我正在研究nodejs上的spawn。以前我使用的是exec,但是exec在stdout (或stderr)蒸中没有兼容性。现在,我有一个关于产卵的残疾。虽然exec接受引用的string命令,但sp保养不接受这一命令,而只接受数组格式。

因此,下面的exec脚本工作正常,但另一个使用派生的脚本将是错误的,因为字符串格式的命令不是数组。

代码语言:javascript
复制
const exec = require('child_process').exec;

exec(` echo foo bar `, (error, stdout, stderr) => {
  if ( error ){ console.log(error) }
  if ( stdout ){ console.log(stdout) }
  if ( stderr ){ console.log(stderr) }
});
代码语言:javascript
复制
const { spawn } = require('child_process');

command = spawn('echo foo bar');

command.stdout.on('data', function (data) {
  console.log(data.toString());
});

command.stderr.on('data', function (data) {
  console.log( data.toString());
});

command.on('exit', function (code) {
  console.log( code.toString());
});

我有很多命令行脚本,这就是我想在nodejs上spawn的地方,所有这些脚本都很复杂,类似于下面的一个。这就是为什么我希望使用字符串格式来指定命令,而不是数组。有什么想法吗?

代码语言:javascript
复制
exec(' bash -ic "expecto \\"sudo bash -ic \\\\\\"rd ; backup_important_batch\\\\\\"\\" $PASSWORD" ', (error, stdout, stderr) => {
    if ( error ){ console.log(error) }
    if ( stdout ){ console.log(stdout) }
    if ( stderr ){ console.log(stderr) }
});
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-10 02:58:51

尝试自动拆分命令如下:

代码语言:javascript
复制
const { spawn } = require('child_process');

let cmd = 'echo foo bar'
let cmdarray = cmd.split(" ");
let command = spawn(cmdarray.shift(), cmdarray);
票数 0
EN

Stack Overflow用户

发布于 2019-09-25 14:21:04

您不能在空格上拆分,因为许多命令行args可能包含像./foo.js --bar "Hello Baz"这样的字符串,在字符串上拆分将不正确地将"Hello Baz"作为参数。

使用像https://www.npmjs.com/package/string-argv这样的库将字符串转换为可以传递字符串的参数,获取数组结果并构建spawn()调用。

编辑:下面是一个例子:

代码语言:javascript
复制
const { spawn } = require('child_process');
const { parseArgsStringToArgv } = require('string-argv');

async function run(command) {
    return new Promise( resolve => {
        let args = parseArgsStringToArgv(command);
        let cmd = args.shift();

        console.log(cmd, args);

        let step = spawn(cmd, args);

        step.stdout.pipe(process.stdout);
        step.stderr.pipe(process.stderr);

        step.on('close', (code) => {
           resolve(code);
        });
    });
}

let name = 'Baz';
let exitCode = await run(`echo "Hello ${name}"`);

票数 9
EN

Stack Overflow用户

发布于 2021-07-16 11:55:03

根据Venryx上面的注释(链接了https://stackoverflow.com/a/45134890/2441655上现有的答案),您可以使用spawn(cmd, [], { shell: true })

例如:

代码语言:javascript
复制
const { spawn } = require('child_process');
const command = spawn('echo foo bar', [], { shell: true });

command.stdout.on('data',data => console.log(data.toString()));
command.stderr.on('data', function (data) {console.log( data.toString());});
command.on('exit', function (code) {console.log( code.toString());});

// foo bar
//
// 0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57429987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档