将命令历史记录导出到 Shell 脚本中

将命令历史记录导出到 Shell 脚本中

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

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

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

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

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

答案1

内置命令fc允许您使用多个条件从历史记录中提取命令(请参阅man zshbuiltins参考资料)。

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

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

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

fc -l -15

默认情况下,fc -l包括历史索引作为其输出的第一列。一旦获得了所需的确切范围,-n就可以删除数字:

fc -ln -12 -5

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

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

fc -l rm ls

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

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

答案2

@jimmij 更正

最初我写这篇文章时考虑到了错误的 shell(bash 而不是 zsh)。下面反映了更正后的代码

这个 stackoverflow 答案:

history | cut -c 8-

此外,要将历史记录限制为一定数量的行,请运行

history -<number of lines> (history -20 prints the last 20 entries)

最后:history -20 | cut -c 8- > commands_list.sh

在该文件的开头敲击 a ,完成。#!/bin/bash #!/bin/zshchmod +x commands_list.sh

相关内容