macOs Nodejs 通过传递命令打开终端以执行

macOs Nodejs open the terminal by passing the command to execute

提问人:Paul 提问时间:11/17/2023 最后编辑:Paul 更新时间:11/18/2023 访问量:81

问:

我有以下代码,应该打开终端并运行命令:

import { ChildProcess, spawn, ChildProcessWithoutNullStreams, ChildProcessByStdio } from 'child_process';
import { Writable, Readable } from 'stream';

const terminal: 
ChildProcessWithoutNullStreams | 
ChildProcessByStdio<Writable, Readable, Readable> |
ChildProcess = spawn('open', ['-b', "com.googlecode.iterm2"]);

terminal.on('spawn', () => {
  console.log("spawn_0")
  if (terminal.stdin) {
    console.log("spawn_1")
    terminal.stdin.write(`tail -n +1 -f ${cacheDir}/${nameFile}.txt\n`);
    terminal.stdin.end();
  }
});

terminal.on('open', () => {
  console.log("open_0")
  if (terminal.stdin) {
    console.log("open_1")
    terminal.stdin.write(`tail -n +1 -f ${cacheDir}/${nameFile}.txt\n`);
    terminal.stdin.end();
  }
});

目前,当运行此代码时,会在控制台中打印以下内容:

spawn_0
spawn_1

终端正确打开,但“ls”命令不执行。

信息:

我有一个txt文件,它会不断更新。 我必须确保当用户调用这部分代码时,用户选择的终端被启动,将文件输出重定向到终端。

JavaScript 节点.js macOS 终端 子进程

评论

1赞 esqew 11/18/2023
有没有理由不能用来列出目录的内容?这将大大提高性能(大规模),并且需要更少的代码。是没有任何 Node 绑定(或编写它们的方法)的其他内容的占位符吗?如果是这样,如果您能够更新代码以更接近您的实际用例,则可能更有意义。fsls
0赞 Paul 11/18/2023
@esqew:我用我应该用的部分更新了命令,用几句话来重定向在终端上不断更新的文本文件的输出。告诉我我是否清楚。
0赞 esqew 11/18/2023
您缺少将在相关终端中执行命令的程序。Nodejs 子进程的副本:从已初始化的进程写入 stdin\n
0赞 Paul 11/18/2023
我通过提出它来纠正这个问题,但它仍然不起作用。调用终端,但未传递命令。Open 事件,则不被调用。Spawn 事件,但 stdin.write 不起作用。

答:

-1赞 Akshit 11/17/2023 #1

试试这个脚本。

import { spawn } from 'child_process';

const terminal = spawn('open', ['-b', 'com.googlecode.iterm2']);

terminal.on('exit', (code, signal) => {
  console.log(`Child process exited with code ${code} and signal ${signal}`);
});

terminal.on('error', (err) => {
  console.error(`Error: ${err.message}`);
});

terminal.stdout?.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

terminal.stderr?.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

terminal.on('close', (code, signal) => {
  console.log(`Child process closed with code ${code} and signal ${signal}`);
});

// Wait for iTerm2 to open before sending the command
setTimeout(() => {
  terminal.stdin?.write('ls\n');
  terminal.stdin?.end();
}, 2000);

评论

0赞 Paul 11/17/2023
谢谢,但它不起作用。
2赞 esqew 11/18/2023
@Akshit 如果你能包括你所做的更改的摘要,以及为什么你认为他们会直接解决 OP 的陈述问题,而不是简单地说“试试这个”,那会更有帮助。考虑到与 OP 的原始设计相对显着的背离,这闻起来像这是您重新打包并作为答案发布的 LLM 的输出。
0赞 Akshit 11/18/2023 #2

如果要将持续更新的文本文件的输出重定向到终端,并且已指定 ls 是要执行的实际命令的占位符,并且考虑到您提到的挑战,让我们尝试此代码。

import { spawn } from 'child_process';
import * as fs from 'fs';

const terminal = spawn('open', ['-b', 'com.googlecode.iterm2']);

terminal.on('exit', (code, signal) => {
  console.log(`Child process exited with code ${code} and signal ${signal}`);
});

terminal.on('error', (err) => {
  console.error(`Error: ${err.message}`);
});

terminal.stdout?.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

terminal.stderr?.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

// Replace 'ls' with your actual command
const command = 'tail -n +1 -f /path/to/your/file.txt';

// Wait for iTerm2 to open before sending the command
setTimeout(() => {
  terminal.stdin?.write(`${command}\n`);
  terminal.stdin?.end();
}, 2000);

在这里,我将 ls 替换为连续输出文本文件内容的占位符命令(tail -n +1 -f /path/to/your/file.txt)。请确保将 /path/to/your/file.txt 替换为持续更新的文本文件的实际路径。

此修改后的代码应打开 iTerm2,等待 2 秒,然后发送指定的命令以在终端中连续显示文本文件的内容。

评论

0赞 Paul 11/18/2023
谢谢,我又试了一遍代码(我不明白它在逻辑上与以前有何不同),但是终端打开了,但命令没有传递到终端。只有终端,它什么都不做。