node.js - child_process spawn() 中的通配符?

标签 node.js exec spawn

我想在 node.js 中执行类似“doSomething ./myfiles/*.csv”的命令。我想使用 spawn 而不是 exec,因为它是某种监视进程,我需要 stdout 输出。

我试过了

var spawn = require('child_process').spawn; 
spawn("doSomething", ["./myfiles/*.csv"]);

但是通配符 *.csv 将不会被解释。

使用 spawn() 时不能使用通配符吗?有没有其他方法可以解决这个问题?

谢谢

托本

最佳答案

* 正在由 shell 扩展,而对于 child_process.spawn,参数作为字符串传入,因此永远不会正确扩展。这是 spawn 的限制。您可以尝试 child_process.exec 代替,它将允许 shell 正确扩展任何通配符:

var exec = require("child_process").exec;

var child = exec("doSomething ./myfiles/*.csv",function (err,stdout,stderr) {
    // Handle result
});

如果您出于某种原因确实需要使用 spawn,也许您可​​以考虑在 Node 中使用 node-glob 之类的库自己扩展通配 rune 件模式。在创建子进程之前?

更新

在 Joyent Node 核心代码中,我们可以观察到通过 spawn 在 shell 中调用任意命令的方法,同时保留完整的 shell 通配符扩展:

https://github.com/joyent/node/blob/937e2e351b2450cf1e9c4d8b3e1a4e2a2def58bb/lib/child_process.js#L589

这是一些伪代码:

var child;
var cmd = "doSomething ./myfiles/*.csv";

if ('win32' === process.platform) {
    child = spawn('cmd.exe', ['/s', '/c', '"' + cmd + '"'],{windowsVerbatimArguments:true} );
} else {
    child = spawn('/bin/sh', ['-c', cmd]);
}

关于node.js - child_process spawn() 中的通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11717281/

相关文章:

node.js - GitLab CI/CD shell 执行器 : npm command not found

javascript - 在数组(或 objs)上迭代异步的最聪明/最干净的方法是什么?

node.js - successRedirect 不适用于 Passport 登录passport-local

Python 3.2.1 : exec ('x = y()' ) sets a value in a toy example, 但不在完整代码中

node.js - 带有 child_process 的 NodeJs 脚本在 Windows 上生成,为什么我需要 'shell: true' 才能出现 ENOENT 错误?

ssh - 期望脚本在ssh的for循环中不起作用

c# - 从 Node 监听 Co​​nsoleTraceListener 日志

node.js - 用子项目集中项目中的 node_modules

php - 壳牌执行 Jar Php

php - 替代 PHP exec() 函数