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 的回答中提到的问题。]
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)