如何从 Node js 操作终端的历史记录

问题描述 投票:0回答:1

我正在用node.js(对于mac,bash)构建一个cli工具,它可以让你交互式地构建一个命令并运行它。例如,您可以运行“node myTool”,然后它会询问您一些问题,最后运行一个命令。问题是,我希望用户能够通过按“向上”键再次运行最终命令。目前,当用户按“向上”时,他会得到:“node myTool”,但我想给他正在运行的实际命令。 我可以在 bash 中通过像这样操纵历史来做到这一点:

echo 'final command' >> $HISTFILE &&  history -r $HISTFILE

这实际上是有效的,当我按“向上”时,我看到“最终命令”,但它无法通过使用 execSync 从 node.js 工作:

execSync(`echo 'final command' >> $HISTFILE &&  history -r $HISTFILE`);

它成功地将“最终命令”附加到历史记录中,但由于显而易见的原因,“history -r”不会刷新终端。 有没有办法真正刷新终端的历史记录以达到用户预期的结果??

node.js bash macos terminal history
1个回答
0
投票

您正在新的 shell 进程中运行

history -r
,而不是用户原来的交互式 shell。每个 shell 进程都保留自己的历史记录,重新加载子 shell 的历史记录不会影响父 shell 的历史记录。

一般来说,没有直接的方法可以修改父 shell 的状态。旨在通过输出 shell 命令来完成此工作的程序。用户通过命令替换获取输出,然后使用

eval
执行它(例如
tset
)来使用它们。

所以你可以将你的node.js脚本更改为

fs.writeFileSync(process.env.HISTFILE, "final command\n", "a");
process.stdout.write(`history -r "$HISTFILE"`);

然后你可以用它作为

eval "$(node scriptname.js)"

但在这种情况下,脚本无法对 stdout 执行任何“正常”输出,因为它打印的任何内容都将由

eval
执行,而不是显示在终端上。

© www.soinside.com 2019 - 2024. All rights reserved.