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

Mat*_*eck 33 shell bash command-history

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

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

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

cam*_*amh 46

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

fc -ln -1
Run Code Online (Sandbox Code Playgroud)

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

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

这应该像您在问题中所问的那样起作用。

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

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

  • 第一种形式`fc -lnr | head -n 1` 可以缩写为 `fc -lnr -1`。 (5认同)
  • 它代表“修复命令”。http://www.gnu.org/software/bash/manual/bashref.html#Bash-History-Builtins (2认同)

gle*_*man 10

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

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

$ fc -lnr | head -1
         echo "one
Run Code Online (Sandbox Code Playgroud)

尝试这个:

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

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

$ getlast
         echo "one
two
three"
Run Code Online (Sandbox Code Playgroud)

  • 启用 `cmdhist` 将解决这个问题:“如果设置,bash 会尝试将多行命令的所有行保存在同一历史记录条目中。这允许轻松重新编辑多行命令。” (3认同)