Answers:
如果使用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
(即,以fc
as 调用)fc -ln "" ""
,则仅输出最后一条命令。
[注意:答案已编辑,以说明@Bram的评论以及@glenn jackman的答案中提到的问题。
help fc
我的文档。bash手册页有更多详细信息,包括对负索引的使用。消除head
效果很好,因为剩下的一个命令是内置的,因此现在没有fork / exec。
fc
……
@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"
cmdhist
将修复以下问题:“如果设置,bash会尝试将多行命令的所有行保存在同一历史记录条目中。这样可以轻松地重新编辑多行命令。”
您可以使用而不是使用向上箭头"!!"
来引用上一个命令。
例如
$ some -long --command --difficulty="very hard to remember"
$ echo "!!" >> LOGBOOK
注意:这不引用文字文本
ls | less
-> echo !! >> LOGBOOK
-> echo ls | less >> LOGBOOK
。
如果使用的是bash shell,则可以使用以下命令执行此操作:
$> history -a LOGBOOK
这会将当前会话中的所有命令附加到该文件,您也可以在〜/ .bashrc文件中添加一个别名,以使用单个命令执行此操作:
$> alias getlast="history -a LOGBOOK"
fc -lnr | head -n 1
可以缩写为fc -lnr -1
。