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


29

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

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

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

Answers:


37

如果使用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的答案中提到的问题。


5
第一种形式fc -lnr | head -n 1可以缩写为fc -lnr -1
布拉姆

@布拉姆:好东西。我正在使用help fc我的文档。bash手册页有更多详细信息,包括对负索引的使用。消除head效果很好,因为剩下的一个命令是内置的,因此现在没有fork / exec。
camh 2012年

1
我不知道为什么会调用该命令fc……
imz-伊万·扎哈拉里舍夫(Ivan Zakharyaschev)2012年


9

@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
启用cmdhist将修复以下问题:“如果设置,bash会尝试将多行命令的所有行保存在同一历史记录条目中。这样可以轻松地重新编辑多行命令。”
Mark McKinstry

2

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

例如

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

注意:这不引用文字文本


5
那不会捕获文字命令。如果有任何外壳元字符,将对其进行评估和替换。管道也会中断:ls | less-> echo !! >> LOGBOOK-> echo ls | less >> LOGBOOK
卡姆(Camh)2012年

0

如果使用的是bash shell,则可以使用以下命令执行此操作:

$> history -a LOGBOOK

这会将当前会话中的所有命令附加到该文件,您也可以在〜/ .bashrc文件中添加一个别名,以使用单个命令执行此操作:

$> alias getlast="history -a LOGBOOK"

1
但是您错过了更重要的要求,即我只保存有效的命令并获得结果。我不想保存我最近完成的所有命令,只需在使用它们后选择它们即可。不管怎么说,还是要谢谢你。
MattLBeck'5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.