如何将最后一条命令保存到文件中?

如何将最后一条命令保存到文件中?

当我使用 bash shell 运行分析时,我经常想将我使用过的给我带来良好结果的命令保存到同一目录(我的“LOGBOOK”,如其名称)中的文件中,以便我可以检查哪些内容我这样做是为了得到这些结果。到目前为止,这意味着我要么从终端复制粘贴命令,要么按“向上”将命令修改为echo"my command" >> LOGBOOK,或其他类似的滑稽动作。

前几天我发现有一个history工具,但我找不到使用它来获取先前执行的命令的方法,以便我可以执行类似的操作getlast >> LOGBOOK

有没有一个很好的简单方法来做到这一点。或者,其他人如何处理保存他们所得到的结果的命令?

答案1

如果您使用的是bash,您可以使用以下fc命令以您想要的方式显示您的历史记录:

fc -ln -1

这将打印出您的最后一个命令。-l表示列表,-n表示不使用命令编号作为行前缀,并-1表示仅显示最后一个命令。如果行开头的空格(仅多行命令的第一行)很麻烦,您可以使用 轻松摆脱它sed。把它变成一个 shell 函数,你就得到了所要求的解决方案(getlast >> LOGBOOK):

getlast() {
    fc -ln "$1" "$1" | sed '1s/^[[:space:]]*//'
}

这应该按照您在问题中所要求的那样发挥作用。

"$1" "$1"我通过添加到命令中添加了一些细微的变化fc。例如,这将允许您getlast mycommand打印出调用的最后一个命令行mycommand,因此,如果您在运行另一个命令之前忘记保存,您仍然可以轻松保存命令的最后一个实例。如果您不传递参数getlast(即调用fcas fc -ln "" "",它仅打印出最后一个命令)。

[注:编辑答案以解释@Bram 的评论和@glenn jackman 的答案中提到的问题。]

答案2

@camh 的答案的一个问题是,如果您有一个跨越多行的命令,它只显示第一行:

$ echo "one
> two
> three"
one
two
three

$ fc -lnr | head -1
         echo "one

尝试这个:

$ alias getlast='fc -nl $((HISTCMD - 1))'

$ echo "one
> two
> three"
one
two
three

$ getlast
         echo "one
two
three"

答案3

"!!"您可以使用来引用上一个命令,而不是使用向上箭头。

例如

$ some -long --command --difficulty="very hard to remember"
$ echo "!!" >> LOGBOOK

注意:这不引用文字

答案4

fc -l | awk 'FNR == 15 {print $2}' > /tmp/last_command

我使用 awk 从 fc -l 输出捕获最后一个命令并将其打印到 /tmp/last_command

相关内容