gpt4 book ai didi

node.js - 带有字符串而不是数组的nodejs spawn命令?

转载 作者:行者123 更新时间:2023-12-03 12:13:52 24 4
gpt4 key购买 nike

我正在处理 spawn在 nodejs 上。以前我使用 exec但是 exec 在 stdout(或 stderr)流中没有兼容性。
现在,我对 spawn 有障碍。似乎 exec 接受了带引号的字符串命令,而 spawn 不接受那个命令,只是数组格式。

所以下面的 exec 脚本工作正常,但另一个使用 spawn 的脚本会出错,因为字符串格式的命令不是数组。

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) }
});
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());
});


我有很多命令行脚本,这正是我想要的 spawn在 nodejs 上,它们都很复杂,就像下面一个。这就是为什么我想使用字符串格式来指定命令而不是数组。任何的想法?
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) }
});

最佳答案

您不能在空格上拆分,因为许多命令行参数可能包含像 ./foo.js --bar "Hello Baz" 这样的字符串。 , 在字符串上拆分会错误地为您提供 "Hello Baz"作为论据。

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

编辑:这是一个例子:

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}"`);

关于node.js - 带有字符串而不是数组的nodejs spawn命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57429987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com