2

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

我发现很多时候我在命令行单行程序上进行了很多迭代,当我最终经常使用它,或者预计将来想要使用它,或者当它变得很麻烦时一行,通常最好将单行代码转换为 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以注入!523rd 命令并以某种方式将其硬塞到要保存的可接受字符串中。

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

  • 不能在 bash 中工作,因为它不能完成!523
  • 需要一些人工检查和弦擒纵机构
  • 需要输入太多诸如脚本名称必须输入两次

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

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

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

更新:我同意@Floris 的评论,即直接使用 !! 尽管我不确定如何进行这项工作,但会有所帮助。假设我的用法是

mkscript command_number_24 !24

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

4

1 回答 1

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

仅在 Bash 中测试。

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

于 2013-03-29T15:54:02.323 回答