node.js - 为什么 nodejs exec/spawn 不显示 bash 'history' 命令的任何输出?
问题描述
我在 Ubuntu 上运行它,并尝试了许多 exec/spawn 函数(及其同步对应函数)的变体,但没有一个可以向我显示 bash 'history' 命令的输出。一种情况如下:
const { spawnSync} = require('child_process');
const child = spawnSync('history', { shell: "/bin/bash" });
console.log('error: ', child.error);
console.log('stdout: ', child.stdout.toString());
console.log('stderr: ', child.stderr);
它没有显示任何错误并且输出为空。我认为这个问题与历史命令的“专业”或类别有关,而不是 nodejs 的功能,因为它们对于 ls、pwd、whoami 等普通命令工作正常。我查看了我的 .bash_history 文件,它充满了历史,所以这不是问题。
另一个可能类似的问题是ll
即使我将 bash 设置为 shell,命令也会失败。但是对于ll
,它确实返回一个错误:
/bin/bash: ll: 找不到命令
可以肯定的是,我尝试ll
在 bash 中运行命令它工作得很好。我在这里想念什么?
编辑:我做了更多的测试,它看起来更像是一个 bash 的东西而不是一个节点的东西。当我简单地编写history
命令时,bash 会打印结果,但是当我这样做时bash -c history
,它不会显示任何输出,也不会显示错误。
解决方案
您需要订阅来自子进程的消息
child.on('error', (err) => {
});
child.stderr.on('data', (data) => {
});
child.on('exit', (code, signal) => {
});
推荐阅读
- android - 如何在 andorid 中读取 Apollo 规范化 SQL 缓存?
- linux - 从 162.158 或 141.101 开始的 IP 的用户代理“Java/11.0.10”积极爬取网站
- java - 如何修复“无法使受保护的最终 java.lang.Class java.lang.ClassLoader.defineClass?
- windows - 批量将 CSV 文件转换为 hex 文件
- terraform - 具有依赖关系的 terraform 条件模块
- okta - 结合 Vue(前端)、Python(后端 API)和 Okta(身份验证)的“正确”方式
- javascript - ANT Design Form.List 不会删除元素
- c# - CS1061:“书签”不包含“项目”的定义
- node.js - 即使我在nodejs服务器中使用了等待,控制也没有等待
- ruby-on-rails - 推送到 Heroku 时无法升级 Ruby 版本