将历史命令转换为shell脚本

时间:2013-03-29 15:08:03

标签: bash shell unix zsh

这是我认为很多人会经常使用的那些东西之一,但我似乎找不到任何写过这类事情的人。

我发现很多时候我在命令行单行上进行了大量的迭代,当我最终使用它时,或者预计将来要使用它时,或者当它变得很麻烦时在一行中工作,通常最好将单行内容转换为shell脚本并将其粘贴在合理且易于访问的地方,如~/bin

使用任何涉及文本编辑器的环形交叉方法来完成此操作显然过于繁琐,并且可以在shell上执行此操作,例如在zsh类型中

echo "#!/usr/bin/env sh" > ~/bin/command_from_history_number_523.sh && echo !523 >> ~/bin/command_from_history_number_523.sh

然后按 Tab 注入!523 rd命令,并以某种方式将其钉入可接受的字符串中进行保存。

这特别麻烦,至少有三个问题:

  • 无法在bash中使用,因为它无法完成!523
  • 需要一些手动检查和字符串擒纵
  • 需要输入太多内容,例如必须输入两次脚本名称

所以看起来我需要在这里做一些meta shell脚本。

我认为一个好的解决方案可以在bash和zsh下运行,它应该可以通过获取两个参数来工作,一个是历史命令编号的整数,另一个是shell脚本的名称,用于在包含该编码的硬编码目录中输出一个命令。此外,在bash下,似乎多行命令被视为单独的命令,但我愿意假设我们只关心这里的单行,而我现在只使用zsh。

这里的绊脚石是我认为即使使用zsh,我仍然会通过bash运行shell脚本,因此它不太可能解析zsh的历史文件。我可能需要将它分成两个独立的程序。

更新:我同意@Floris的评论,直接使用命令,如!!虽然我不知道如何使这项工作,但会有所帮助。假设我的用法是

mkscript command_number_24 !24

这是不合适的,因为mkscript将接收第24个命令的扩展内容。如果第24个命令包含任何文件全局或某些文件,它们将已经扩展。这很糟糕,我基本上想要历史文件的内容,即原始命令字符串。我想这可以通过在这里手动实现这些快捷方式来解决。或者只是搞砸它,只需要一个整数参数。

1 个答案:

答案 0 :(得分:2)

function mkscript() { 
    echo '#!/bin/bash' > ~/bin/$2
    history -p '!'$1 >> ~/bin/$2
}

仅在Bash中测试过。

从OP更新:在zsh中,我可以使用fc -l $2 $2

完成此操作