如何在Nodejs中同时显示提示和命令输出?



我正在尝试使用Nodejs制作shell环境,并在我的程序中遇到以下缺陷。我尝试使用readline-sync和prompt-sync来解决问题,并描述了接下来的问题。

我有以下代码:

const prompt = require('prompt-sync')({sigint: true});
const { spawn } = require("child_process");
const os = require('os')
working_dir = os.homedir();
user_cmd = "";
while (user_cmd != "exit") {
user_cmd = prompt(working_dir + " >");

if (user_cmd.match("ls") != null) {
const ls = spawn("ls");

ls.stdout.on("data", data => {
console.log(`${data}`);
});
ls.stderr.on("data", data => {
console.log(`${data}`);
});
ls.on('error', (error) => {
console.log(`${error.message}`);
});
}
} 

我想这样输出:

每个提示符后的输出

hi@SanthoshSingh:/mnt/e/Atri Labs$ node shell.js 
/home/hi >ls
hi.js
ls.js
node_modules
package-lock.json
package.json
shell.js
/home/hi >exit

但是以这种方式得到输出:

在所有提示符之后得到输出

hi@SanthoshSingh:/mnt/e/Atri Labs$ node shell.js 
/home/hi >ls
/home/hi >exit
hi.js
ls.js
node_modules
package-lock.json
package.json
shell.js

给我一个解决方案:-)

prompt-sync阻塞了/dev/tty.除非退出它,否则无法将标准输出缓冲区打印到tty(屏幕)。只有在退出while循环后才能退出它(prompt-sync)。

下面是解决上述问题的另一种实现:

const prompt = require('prompt-sync')({sigint: true});
const { spawn } = require("child_process");
const os = require('os')
working_dir = os.homedir();
user_cmd = "";
function call() {
user_cmd = prompt(working_dir + " >");
const ls = spawn(user_cmd);
ls.stdout.on("data", data => {
console.log(`${data}`);
ls.kill('SIGINT')
});
ls.stderr.on("data", data => {
console.log(`${data}`);
});
ls.on('error', (error) => {
console.log(`${error.message}`);
ls.kill('SIGINT')
});
ls.on('exit', (error) => {
call()
});
}
const interval = setInterval(function () { }, 1000)
process.on('exit', () => {
clearTimeout(interval)
})
call()  

最新更新