提问人:Paul 提问时间:11/17/2023 最后编辑:Paul 更新时间:11/18/2023 访问量:81
macOs Nodejs 通过传递命令打开终端以执行
macOs Nodejs open the terminal by passing the command to execute
问:
我有以下代码,应该打开终端并运行命令:
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文件,它会不断更新。 我必须确保当用户调用这部分代码时,用户选择的终端被启动,将文件输出重定向到终端。
答:
-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
谢谢,我又试了一遍代码(我不明白它在逻辑上与以前有何不同),但是终端打开了,但命令没有传递到终端。只有终端,它什么都不做。
评论
fs
ls
\n