node.js -- 同步执行命令并获取结果
Posted
技术标签:
【中文标题】node.js -- 同步执行命令并获取结果【英文标题】:node.js -- execute command synchronously and get result 【发布时间】:2011-11-03 05:47:54 【问题描述】:我正在尝试在 node.js 中同步执行 child_process(是的,我知道这很糟糕,我有充分的理由)并在 stdout 上检索任何输出,但我不太清楚如何...
我发现了这个 SO 帖子:node.js execute system command synchronously,它描述了如何使用库 (node-ffi) 来执行命令,这很好用,但我唯一能得到的是进程退出代码。该命令执行的任何数据都直接发送到标准输出——我如何捕获它?
> run('whoami')
username
0
换句话说,username
被回显到标准输出,run
的结果是0
。
我会很多而不是弄清楚如何读取标准输出
【问题讨论】:
试着看看[这里][1]。这是对同一个问题的讨论。 [1]:***.com/questions/4443597/… 【参考方案1】:所以我有一个可行的解决方案,但并不完全喜欢它......只是在这里发布以供参考:
我正在使用其他 SO 帖子中引用的 node-ffi
库。我有一个功能:
>> run-sync-output
执行它
同步读取run-sync-output
并存储结果
删除此 tmp 文件
返回结果
有一个明显的问题,如果用户没有对当前目录的写入权限,它就会失败。另外,这只是浪费精力。 :-/
【讨论】:
【参考方案2】:我已经构建了一个 node.js 模块来解决这个确切的问题。看看吧:)
exec-plan
更新
上面的模块解决了你原来的问题,因为它允许子进程的同步链接。链中的每个环节都从链中的前一个进程获取标准输出。
【讨论】:
该模块中的哪些方法可用于获取命令的输出? 该模块的目的是建立一个命令链作为计划,stdout/err 将可用于计划中“next”命令的“preLogic”功能。因此,例如:如果您有 execPlan.add('ps -ef');然后,在下一次“添加”时,您可以使用“预逻辑”函数作为第一个参数来使用“ps -ef”的输出。例如: execPlan.add(function (stdout) // 对在 'grep ls' 之前运行的 'ps -ef' 的标准输出做一些事情 , 'grep ls');。如果此评论没有很好地阐明,您可以在模块的 github 站点本身上发布吗?另外,检查 README.md :) 是否可以使用此模块将命令行输出作为字符串返回(而不仅仅是使用 console.log 打印它?) 另外,如果这个答案实际上解释了如何模块将解决问题,而不是简单地提供相关链接,那会更好。 我更新了答案。感谢您提供更好的说明的建议。【参考方案3】:我遇到了类似的问题,我最终为此编写了一个节点扩展。您可以查看 git 存储库。它是开源和免费的,而且所有的好东西!
https://github.com/aponxi/npm-execxi
ExecXI 是一个用 C++ 编写的节点扩展,用于执行 shell 命令 一个一个,将命令的输出输出到控制台 即时的。存在可选的链式和非链式方式;意义 您可以选择在命令失败后停止脚本 (链式),或者您可以像什么都没发生一样继续!
使用说明在ReadMe file 中。随意提出拉取请求或提交问题!
但是它还没有返回标准输出......好吧,我今天刚刚发布了它。也许我们可以以此为基础。
无论如何,我认为值得一提。我也将这个发布到一个类似的问题:node.js execute system command synchronously
【讨论】:
【参考方案4】:从 Node 版本 v0.11.12 开始,有一个 child_process.execSync
函数用于此。
【讨论】:
【参考方案5】:除了编写代码有点不同之外,实际上没有理由做任何同步的事情。
你不喜欢这个? (docs)
var exec = require('child_process').exec;
exec('whoami', function (error, username)
console.log('stdout: %s', username);
continueWithYourCode();
);
【讨论】:
其实有这种情况。我有一个链接到stylus
的库,它从单个图像编译 CSS 精灵。由于stylus
是同步写入的,因此任何挂钩也必须是同步的。我不打算重新编写整个解析引擎,即使我这样做了,它也可能不会被主分支接受,我的外部库只能在我的分支上工作。
-1 "没有理由..." 你怎么知道?我讨厌这些永远无法证明是正确的毫无意义的论点,事实上你是错的,在某些情况下,同步做事要么是必须的,要么是有帮助的。
@rFactor:实际上没有理由。您可以说正确同步代码更容易,因为您已经习惯了,但实际上没有理由。
@dresende 它与“轻松”无关。例如,我现在对此有一个问题。我正在尝试让 Dart frog 编译器与 Node 的 require()
一起使用。官方且唯一的方法是使用module.require.extensions['.dart'] = ...
。编译工作,但是,require
是同步的,所以我的 Dart 编译器不能是异步的,编译器是第 3 方可执行文件,所以我可以执行它。看?除了同步执行之外,没有办法解决这个问题。
在编码之前试着把百叶窗从你的眼睛里拿出来,想想算法。如果你不能,那里有很多帮助者,比如github.com/creationix/step 和其他人......以上是关于node.js -- 同步执行命令并获取结果的主要内容,如果未能解决你的问题,请参考以下文章
在 node.js 中导入 sql 文件并针对 PostgreSQL 执行