将命令历史导出到 Shell 脚本

Lyn*_*ite 3 shell command-history zsh

我经常需要遵循复杂的安装过程,例如必须为 buildtools 构建依赖项,为我希望从源代码安装的应用程序构建依赖项。

一旦我完成了一次,我真的不想尝试并记住我所做的所有步骤。

zsh(和其他 shell)中的命令历史记录已经记录了我所做的事情。是否可以将最近执行的 100 个(例如)命令导出到.sh脚本中?

然后我可以编辑这个脚本,删除在我开始安装之前的命令,删除我犯错的命令,并留下一个安装脚本,我可以在类似的环境中提供给其他人。(或在另一台机器上使用我自己。)。

我怀疑,我的命令历史记录已经存储在我的主目录中的一个点文件中。

Ste*_*itt 8

fc内置命令允许你提取使用了一些标准的历史命令(见man zshbuiltins详情)。

fc代表“修复命令”,当不带参数调用时,它会打开一个编辑器,并输入最后一个命令。您可以使用编辑器的所有功能来更改命令,并在保存和退出时zsh运行固定命令。默认使用的编辑器是vi,但可以使用EDITORshell 变量覆盖它,或者,如果您想使用带有fc命令的特定编辑器,FCEDIT.

fc 除了最后一个命令之外,还有许多选项可以操作历史记录,其中一些选项恰好提供了您所要求的功能。

-l选项“列出”了历史的内容。默认情况下,它会列出最后 16 个命令,但您可以指定下限和上限,作为历史记录中的索引,甚至作为命令的起始文本。负索引从最后一个命令返回,因此要提取最后 15 行:

fc -l -15
Run Code Online (Sandbox Code Playgroud)

默认情况下,将fc -l历史索引作为其输出的第一列。获得所需的确切范围后,请-n删除数字,以便:

fc -ln -12 -5
Run Code Online (Sandbox Code Playgroud)

将仅以适合脚本的格式提取那些行(从 12 行到 5 行)。

使用命令作为边界非常有用:

fc -l rm ls
Run Code Online (Sandbox Code Playgroud)

列出从最后一个开始并以最后一个rm结束的所有历史记录ls(因此rm输出中将有一个命令,但可能有多个ls命令)。

还有许多其他选项,例如添加时间戳、替换部分命令、加载和保存部分历史、切换整个历史堆栈……