一个脚手架里有两个命令,我在主命令里使用execa调用另外一个子命令,子命令通过终端交互后会返回数据,我怎么在主命令中获取到这个数据,使用方法如下
const {stdout} =await execa("node", ["bin/main.js", "el"], {
stdio: "inherit",
});
我尝试使用stdio:pipe,但是我的子命令需要终端交互才能获得数据
在使用 execa
库与子进程进行通信时,如果你需要捕获子进程的输出并且子进程依赖于终端交互(如等待用户输入),你需要正确地设置 stdio
选项。在你的情况下,使用 stdio: "inherit"
会使得子进程的输入输出直接继承自父进程(即终端),这通常用于调试或当你希望子进程的输出直接显示在终端上。然而,这样做无法捕获子进程的输出到变量中。
要捕获子进程的输出并且允许终端交互,你可以使用 stdio: ['pipe', 'inherit', 'inherit']
。这里的数组分别代表 stdin
、stdout
和 stderr
的处理方式:
stdin: 'pipe'
允许你从父进程向子进程发送数据(虽然在你的例子中可能不需要)。stdout: 'inherit'
使得子进程的输出显示在终端上(这对于交互是必需的)。stderr: 'inherit'
使得错误输出也显示在终端上(可选,但通常很有用)。然而,由于你希望捕获输出,你可以将 stdout
设置为 'pipe'
而不是 'inherit'
。但这样做会阻止子进程直接接收来自终端的输入(如用户交互)。为了解决这个问题,你可能需要模拟或转发用户的输入到子进程。
解决方案:
如果子命令不需要用户交互:
stdio
设置为 ['ignore', 'pipe', 'pipe']
(忽略输入,捕获输出和错误)。如果子命令需要用户交互:
示例代码(不需要用户交互):
const { execa } = require('execa');
(async () => {
try {
const { stdout, stderr } = await execa("node", ["bin/main.js", "el"], {
stdio: ['ignore', 'pipe', 'pipe']
});
console.log('stdout:', stdout);
if (stderr) {
console.error('stderr:', stderr);
}
} catch (error) {
console.error('Error:', error);
}
})();
注意,这种方法不会显示任何子进程的输出到终端,除非你手动打印它。如果你确实需要显示输出并捕获它,你可能需要更复杂的逻辑来处理输入输出流,这通常涉及到使用 Node.js 的流(streams)功能来监听和转发数据。
我尝试使用C语言中的< code>fork()函数处理Linux中的多个进程,这是我的代码: 现在让我们假设父进程ID为100,两个子进程(p1, p2)ID为101 相反,我看到了一些不同的东西,两个子进程具有相同的PPID,但第一个进程具有与之不同的PID。这是我得到的示例输出: 我的问题是,两个子进程的父PID不应该是3383吗?希望有人能解释这一切在这里是如何运作的,以及我做错了什么(或想
问题内容: 是否可以从Shell脚本中的父进程ID获取子进程ID? 我有一个要使用Shell脚本执行的文件,这会导致一个新进程 process1 (父进程)。这个 过程1 已经分叉的另一个进程 过程2 (子进程)。使用脚本,我可以使用以下命令获取 process1 的pid : 但我无法获取子进程的pid。 问题答案: 只需使用:
是否可以从外壳脚本中的父进程ID获取子进程ID? 我有一个要使用shell脚本执行的文件,这会导致一个新的进程process1(父进程)。此进程1已经派生了另一个进程process2(子进程)。使用脚本,我可以使用以下命令获得进程1的pid: 但是我无法获取子进程的pid。
问题内容: 我在程序开始时设置了numpy随机种子。在程序执行期间,我使用多次运行一个函数。该函数使用numpy随机函数绘制随机数。问题是获取当前环境的副本。因此,每个进程都独立运行,并且都以与父环境相同的随机种子开始。 所以我的问题是如何在父环境中与子进程环境共享numpy的随机状态?请注意,我想用于自己的工作,需要使用一个 单独的类 并在该类中单独进行操作。我尝试使用来共享随机状态,但是似乎事
问题内容: 假设我有一个进程,它恰好产生了一个子进程。现在,当父进程出于某种原因(正常或异常,通过kill,^ C,断言失败或其他任何原因)退出时,我希望子进程死亡。如何正确地做到这一点? 问题答案: 子进程可以通过在syscall中指定选项来要求父进程去世时内核发出(或其他信号),如下所示: 有关详细信息,请参见。 编辑:这是仅Linux
我试图与一个进程通信(该进程本身会写入stdin和stdout,以便在终端中与用户交互),并在C中读取它的stdin和写入它的stdout。 因此,我尝试以编程方式替换shell用户。一个methapohrical示例:假设出于某种原因我想在C中使用VIM。然后我还需要编写命令(stdout)并从编辑器(stdin)中读取内容。 起初我认为这可能是一项微不足道的任务,但似乎没有标准的方法<代码>i
问题内容: 我想使用模块来完成此操作。 当我这样做时,例如: 我启动一个父进程,然后让父进程产生一个子进程, 然后我希望父进程退出自身,但子进程继续工作。 请允许我写一个 错误 代码来解释一下自己: 那么,我如何启动一个在父进程完成时不会被杀死的进程? 20140714 大家好 我的朋友刚刚告诉我一个解决方案… 我只是想… 无论如何,只要让您看到: 这确实有效!! 问题答案: 一个技巧:调用以退出
#include <stdio.h> #include <stdlib.h> int main(void) { pid_t pid; pid = fork(); if (pid < 0) { exit(1); } else if (pid > 0) { printf("Parent\n");